2015-10-21 24 views
0

我正在嘗試通過64個項目的大型列表應用IF語句。我的數據採用以下格式:通過列表中的多個文件應用IF語句

file_list  Large list (64 elements, 4.2 Mb) 


file1: 'data.frame': 3012 obs. of 4 variables: 
..$V1: int[1:3012] 1850 1850 1850 ... 
..$V2: int[1:3012] 1 2 3 ... 
..$V3: int[1:3012] 16 15 16 ... 
..$V4: int[1:3012] 4.69E-05 6.99E-05 5.62E-05 ... 
................................................................................ 
file64: 'data.frame': 5412 obs. of 4 variables: 
..$V1: int[1:5412] 1850 1850 1850 ... 
..$V2: int[1:5412] 1 2 3 ... 
..$V3: int[1:5412] 16 15 16 ... 
..$V4: int[1:5412] 6.96E-05 4.99E-05 5.37E-05 ... 

我想要做的是不同的數字取決於第二列的內容乘以各64個文件的第四列($ V4)($ V2) 。 $ V2中的數字是一年的月份,當$ V2是1,3,5,7,8,10和12時,我需要將$ V4乘以31; 30時,$ V2是4,6,9和11;和28.25當$ V2是2.

我認爲這將涉及某種for循環,但我一直無法完成此任務。有什麼建議麼?

+3

嘗試'lapply(file_list中,函數(x)的變換(X,V4 = ifelse(在%C V2%(1,3,5, V4 * 31,ifelse(V2%以%c(4,6,9,11),V4 * 30,V4 * 28.25))))' – akrun

+1

非常感謝這個解決方案@akrun。它完美的作品。我絕不會在一百萬年內達到這一點! –

+0

Hi @akrun。 12被指定的條件,我加入了。再次感謝。 –

回答

1

下面是一個使用一個小的功能的可重現的解決方案:

file_list <- list(file1 = data.frame(v1 = sample(1:100, 100, TRUE), 
            v2 = sample(c(1,2,3,5,6,8,10,4,6,9,11), 100, TRUE), 
            v4 = rnorm(100)), 
        file2 = data.frame(v1 = sample(1:100, 100, TRUE), 
            v2 = sample(c(1,2,3,5,6,8,10,4,6,9,11), 100, TRUE), 
            v4 = rnorm(100))) 

str(file_list) 
# List of 2 
# $ file1:'data.frame': 100 obs. of 3 variables: 
# ..$ v1: int [1:100] 6 90 66 86 32 33 50 46 19 59 ... 
# ..$ v2: num [1:100] 5 10 2 10 8 6 10 3 5 5 ... 
# ..$ v4: num [1:100] -0.639 -2.234 -0.816 0.997 -0.302 ... 
# $ file2:'data.frame': 100 obs. of 3 variables: 
# ..$ v1: int [1:100] 34 25 24 4 100 59 80 100 21 97 ... 
# ..$ v2: num [1:100] 3 6 8 8 9 1 8 1 3 3 ... 
# ..$ v4: num [1:100] -2.2599 0.0548 -1.1666 -0.4049 0.4681 ... 

myFun <- function(df) { 
    df$v4[df$v2 %in% c(1,3,5,7,8,10,12)] <- df$v4[df$v2 %in% c(1,3,5,7,8,10,12)] * 31 
    df$v4[df$v2 %in% c(4,6,9,11)] <- df$v4[df$v2 %in% c(4,6,9,11)] * 30 
    df$v4[df$v2 == 2] <- df$v4[df$v2 == 2] * 28.25 
    df 
} 

lapply(file_list, myFun) 

# lapply(file_list, FUN = function(x) head(myFun(x))) 
# $file1 
# v1 v2   v4 
# 1 6 5 -19.816836 
# 2 90 10 -69.264329 
# 3 66 2 -23.054110 
# 4 86 10 30.910798 
# 5 32 8 -9.347289 
# 6 33 6 -16.316746 
# 
# $file2 
# v1 v2   v4 
# 1 34 3 -70.055942 
# 2 25 6 1.642744 
# 3 24 8 -36.165864 
# 4 4 8 -12.550877 
# 5 100 9 14.041857 
# 6 59 1 -2.556662 
+0

非常感謝@JasonAizkalns。這也很好用! –