在数据框列表中使用的Complete.cases

时间:2014-07-05 23:20:21

标签: r

我试图从数据框列表中删除所有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;

我想知道的是一些替代方案,或者我是否正确的做法。为什么最后一个例子不起作用呢?

非常感谢你的时间。祝你今天愉快。

4 个答案:

答案 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_incomp列表。它们每个都作为参数传递给函数,我们可以通过这种方式进行适当的提取。否则,如果我们想一步完成,我们可以做到

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值的行。