我有一個資料框串列,其中包含兩列變數: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
我想避免在我的輸出中出現那些空串列,但沒有設法找出我的代碼的問題。有任何想法嗎?
uj5u.com熱心網友回復:
它從 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))
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/479058.html
上一篇:捕獲不回傳的dll函式
下一篇:將幾個回圈的結果組合在一起
