我试图通过一个包含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循环,但我还没有能够完成这项任务。有什么建议吗?
答案 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