通过列表中的多个文件应用IF语句

时间:2015-10-21 15:22:37

标签: r

我试图通过一个包含64个项目的大型列表来应用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;当$ V2为4,6,9和11时; $ V2为2时为28.25。

我认为这将涉及某种for循环,但我还没有能够完成这项任务。有什么建议吗?

1 个答案:

答案 0 :(得分: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