R:运行 函数 + for 循环后列表列表中的空列表
R: empty lists inside list of lists after running function + for loop
我有一个数据框列表,其中包含两列变量:var1 和 var2。 var1 和 var2 中的几个变量是 NA。现在,我想创建一个新的数据帧列表,其中每个数据帧仅包含那些在 var1 或 var2 中没有 NA 值的行。
这是我的数据集的结构:
df1 = data.frame(ID = c(1, 2, 3, 4, 5),
var1 = c(0.1, 0.24, 0.11, 0.8, NA),
var2 = c(1, NA, 0, NA, 1))
df2 = data.frame(ID = c(1, 2, 3, 4, 5),
var1 = c(NA, NA, 0.11, 0.8, 0.1),
var2 = c(100, 19, NA, 9, NA))
df3 = data.frame(ID = c(1, 2, 3, 4, 5),
var1 = c(0.12, 0.3, 0.5, NA, 0.84),
var2 = c(100, 19, 2, 9, 10))
df_list = list(df1, df2, df3)
这是我为完成任务而写的(函数内的 for 循环):
out = lapply(df_list, function(x) {
dfList = list()
for (i in c(2:3)) {
df = x[complete.cases(x[ , i]),]
dfList[[i]] = list(df)
}
return(dfList)
})
现在,这可行,但不是最优的。原因是输出创建了一个列表列表,其中一些列表不包含任何值:
> out
[[1]]
[[1]][[1]]
NULL
[[1]][[2]]
[[1]][[2]][[1]]
ID var1 var2
1 1 0.10 1
2 2 0.24 NA
3 3 0.11 0
4 4 0.80 NA
[[1]][[3]]
[[1]][[3]][[1]]
ID var1 var2
1 1 0.10 1
3 3 0.11 0
5 5 NA 1
[[2]]
[[2]][[1]]
NULL
[[2]][[2]]
[[2]][[2]][[1]]
ID var1 var2
3 3 0.11 NA
4 4 0.80 9
5 5 0.10 NA
[[2]][[3]]
[[2]][[3]][[1]]
ID var1 var2
1 1 NA 100
2 2 NA 19
4 4 0.8 9
[[3]]
[[3]][[1]]
NULL
[[3]][[2]]
[[3]][[2]][[1]]
ID var1 var2
1 1 0.12 100
2 2 0.30 19
3 3 0.50 2
5 5 0.84 10
[[3]][[3]]
[[3]][[3]][[1]]
ID var1 var2
1 1 0.12 100
2 2 0.30 19
3 3 0.50 2
4 4 NA 9
5 5 0.84 10
我想避免在我的输出中出现那些空列表,但未能找出我的代码的问题。有什么想法吗?
从2开始循环,然后赋值,所以1
留空
lapply(df_list, \(x) lapply(2:3, \(i) list(x[complete.cases(x[[i]]),])))
-输出
[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
ID var1 var2
1 1 0.10 1
2 2 0.24 NA
3 3 0.11 0
4 4 0.80 NA
[[1]][[2]]
[[1]][[2]][[1]]
ID var1 var2
1 1 0.10 1
3 3 0.11 0
5 5 NA 1
[[2]]
[[2]][[1]]
[[2]][[1]][[1]]
ID var1 var2
3 3 0.11 NA
4 4 0.80 9
5 5 0.10 NA
[[2]][[2]]
[[2]][[2]][[1]]
ID var1 var2
1 1 NA 100
2 2 NA 19
4 4 0.8 9
[[3]]
[[3]][[1]]
[[3]][[1]][[1]]
ID var1 var2
1 1 0.12 100
2 2 0.30 19
3 3 0.50 2
5 5 0.84 10
[[3]][[2]]
[[3]][[2]][[1]]
ID var1 var2
1 1 0.12 100
2 2 0.30 19
3 3 0.50 2
4 4 NA 9
5 5 0.84 10
注意:在 OP 的代码中,return
在 Filter
取出 NULL
元素后
...
return(Filter(Negate(is.null), dfList))
...
我有一个数据框列表,其中包含两列变量:var1 和 var2。 var1 和 var2 中的几个变量是 NA。现在,我想创建一个新的数据帧列表,其中每个数据帧仅包含那些在 var1 或 var2 中没有 NA 值的行。
这是我的数据集的结构:
df1 = data.frame(ID = c(1, 2, 3, 4, 5),
var1 = c(0.1, 0.24, 0.11, 0.8, NA),
var2 = c(1, NA, 0, NA, 1))
df2 = data.frame(ID = c(1, 2, 3, 4, 5),
var1 = c(NA, NA, 0.11, 0.8, 0.1),
var2 = c(100, 19, NA, 9, NA))
df3 = data.frame(ID = c(1, 2, 3, 4, 5),
var1 = c(0.12, 0.3, 0.5, NA, 0.84),
var2 = c(100, 19, 2, 9, 10))
df_list = list(df1, df2, df3)
这是我为完成任务而写的(函数内的 for 循环):
out = lapply(df_list, function(x) {
dfList = list()
for (i in c(2:3)) {
df = x[complete.cases(x[ , i]),]
dfList[[i]] = list(df)
}
return(dfList)
})
现在,这可行,但不是最优的。原因是输出创建了一个列表列表,其中一些列表不包含任何值:
> out
[[1]]
[[1]][[1]]
NULL
[[1]][[2]]
[[1]][[2]][[1]]
ID var1 var2
1 1 0.10 1
2 2 0.24 NA
3 3 0.11 0
4 4 0.80 NA
[[1]][[3]]
[[1]][[3]][[1]]
ID var1 var2
1 1 0.10 1
3 3 0.11 0
5 5 NA 1
[[2]]
[[2]][[1]]
NULL
[[2]][[2]]
[[2]][[2]][[1]]
ID var1 var2
3 3 0.11 NA
4 4 0.80 9
5 5 0.10 NA
[[2]][[3]]
[[2]][[3]][[1]]
ID var1 var2
1 1 NA 100
2 2 NA 19
4 4 0.8 9
[[3]]
[[3]][[1]]
NULL
[[3]][[2]]
[[3]][[2]][[1]]
ID var1 var2
1 1 0.12 100
2 2 0.30 19
3 3 0.50 2
5 5 0.84 10
[[3]][[3]]
[[3]][[3]][[1]]
ID var1 var2
1 1 0.12 100
2 2 0.30 19
3 3 0.50 2
4 4 NA 9
5 5 0.84 10
我想避免在我的输出中出现那些空列表,但未能找出我的代码的问题。有什么想法吗?
从2开始循环,然后赋值,所以1
留空
lapply(df_list, \(x) lapply(2:3, \(i) list(x[complete.cases(x[[i]]),])))
-输出
[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
ID var1 var2
1 1 0.10 1
2 2 0.24 NA
3 3 0.11 0
4 4 0.80 NA
[[1]][[2]]
[[1]][[2]][[1]]
ID var1 var2
1 1 0.10 1
3 3 0.11 0
5 5 NA 1
[[2]]
[[2]][[1]]
[[2]][[1]][[1]]
ID var1 var2
3 3 0.11 NA
4 4 0.80 9
5 5 0.10 NA
[[2]][[2]]
[[2]][[2]][[1]]
ID var1 var2
1 1 NA 100
2 2 NA 19
4 4 0.8 9
[[3]]
[[3]][[1]]
[[3]][[1]][[1]]
ID var1 var2
1 1 0.12 100
2 2 0.30 19
3 3 0.50 2
5 5 0.84 10
[[3]][[2]]
[[3]][[2]][[1]]
ID var1 var2
1 1 0.12 100
2 2 0.30 19
3 3 0.50 2
4 4 NA 9
5 5 0.84 10
注意:在 OP 的代码中,return
在 Filter
取出 NULL
元素后
...
return(Filter(Negate(is.null), dfList))
...