我试图从数据框列表中删除所有NA值。我让它工作的唯一方法是在for循环中使用complete.cases清理数据。有没有另外一种方法可以用lapply来做这件事,因为我已经尝试了一段时间无济于事。这是有效的代码。
我从
开始data_in <- lapply (file_name,read.csv)
然后:
clean_data <- list()
for (i in seq_along(id)) {
clean_data[[i]] <- data_in[[i]][complete.cases(data_in[[i]]), ]
}
但我试图开始工作的是像这样一直使用lapply。
comp <- lapply(data_in, complete.cases)
clean_data <- lapply(data_in, data_in[[id]][comp,])
返回此错误&#34; [.default
(xj,i)中的错误:无效的下标类型&#39; list&#39; &#34;
我想知道的是一些替代方案,或者我是否正确的做法。为什么最后一个例子不起作用呢?
非常感谢你的时间。祝你今天愉快。
答案 0 :(得分:3)
欢迎来到SO,请在下次提供一些工作代码
这是我如何使用na.omit
(因为complete.cases
仅返回逻辑)
(dat.l <- list(dat1 = data.frame(x = 1:2, y = c(1, NA)),
dat2 = data.frame(x = 1:3, y = c(1, NA, 3))))
# $dat1
# x y
# 1 1 1
# 2 2 NA
#
# $dat2
# x y
# 1 1 1
# 2 2 NA
# 3 3 3
Map(na.omit, dat.l)
# $dat1
# x y
# 1 1 1
#
# $dat2
# x y
# 1 1 1
# 3 3 3
答案 1 :(得分:3)
我不确定你的预期
clean_data <- lapply(data_in, data_in[[id]][comp,])
lapply
的第二个参数应该是一个适当的函数,data_in
列表的每个成员将一次传递一个。您的表达式data_in[[id]][comp,]
不是函数。我不确定您预期id
的来源,但lapply
不会为您创建魔术变量。此外,此时comp
现在是索引的列表。您没有尝试与data_in
列表同步迭代此列表。如果您想在两个单独的步骤中执行此操作,则更合适的方法是
comp <- lapply(data_in, complete.cases)
clean_data <- Map(function(d,c) {d[c,]}, data_in, comp)
我们使用Map
同时迭代data_in
和comp
列表。它们每个都作为参数传递给函数,我们可以通过这种方式进行适当的提取。否则,如果我们想一步完成,我们可以做到
clean_data <- lapply(data_in, function(x) x[complete.cases(x),])
答案 2 :(得分:0)
你的意思是下面的吗?
> lst
$a
a
1 1
2 2
3 NA
4 3
5 4
$b
b
1 1
2 NA
3 2
4 3
5 4
$d
d e
1 NA 1
2 NA 2
3 3 3
4 4 NA
5 5 NA
> f <- function(x) x[complete.cases(x),]
> lapply(lst, f)
$a
[1] 1 2 3 4
$b
[1] 1 2 3 4
$d
d e
3 3 3
答案 3 :(得分:0)
file_name[complete.cases(file_name), ]
complete.cases()仅返回逻辑值。这样就可以完成工作,并且只返回没有NA值的行。