将数据帧列表提供给子集并覆盖dfs

时间:2014-08-28 19:29:08

标签: r

我正在尝试将每个数据框子集,以排除第一列为NA或“”的行。我尝试将数据帧放入列表df,然后在每个数据帧上使用lapply。该代码有效,只是我不知道如何用子集覆盖每个数据帧。

df1 <- data.frame(v1=c(1, 2, 3, NA, NA, NA), v2=rep(1, 6))
df2 <- data.frame(v11=c(2, 3, 4, 5, NA, ""), v22=rep(1, 6))
df3 <- data.frame(v111=c(3, 4, 5, 6, 7, NA), v222=rep(1, 6))

df <- list(df1=df1, df2=df2, df3=df3)
df

$df1
# v1 v2
# 1  1  1
# 2  2  1
# 3  3  1
# 4 NA  1
# 5 NA  1
# 6 NA  1
# 
# $df2
# v11 v22
# 1    2   1
# 2    3   1
# 3    4   1
# 4    5   1
# 5 <NA>   1
# 6        1
# 
# $df3
# v111 v222
# 1    3    1
# 2    4    1
# 3    5    1
# 4    6    1
# 5    7    1
# 6   NA    1

lapply(names(df), function(x) df[[x]][!(is.na(df[[x]][,1]) | df[[x]][,1]==""), ])

# [[1]]
# v1 v2
# 1  1  1
# 2  2  1
# 3  3  1
# 
# [[2]]
# v11 v22
# 1   2   1
# 2   3   1
# 3   4   1
# 4   5   1
# 
# [[3]]
# v111 v222
# 1    3    1
# 2    4    1
# 3    5    1
# 4    6    1
# 5    7    1

最后,我希望df3如下:

df3
#  v111 v222
#1    3    1
#2    4    1
#3    5    1
#4    6    1
#5    7    1

4 个答案:

答案 0 :(得分:6)

您可以将lapply简化为以下格式(以便保留数据框的名称)

df <- lapply(df, function(x) x[!(is.na(x[1]) | x[1] == ""), ])

然后使用list2env将数据帧恢复到全局环境

list2env(df, .GlobalEnv)

然后您只需

即可检查新数据框
df1
##   v1 v2
## 1  1  1
## 2  2  1
## 3  3  1

答案 1 :(得分:1)

这是你在找什么?

df <- lapply(
  names(df),
  function(x){
    df[[x]][!(is.na(df[[x]][,1]) | df[[x]][,1]==""), ]
  })

给你

> df
[[1]]
  v1 v2
1  1  1
2  2  1
3  3  1

[[2]]
  v11 v22
1   2   1
2   3   1
3   4   1
4   5   1

[[3]]
  v111 v222
1    3    1
2    4    1
3    5    1
4    6    1
5    7    1

答案 2 :(得分:0)

complete.cases

怎么样?
df2[df2==""] <- NA
lapply(df, FUN = function(x) x[complete.cases(x),])

$df1
  v1 v2
1  1  1
2  2  1
3  3  1

$df2
  v11 v22
1   2   1
2   3   1
3   4   1
4   5   1

$df3
  v111 v222
1    3    1
2    4    1
3    5    1
4    6    1
5    7    1

如果你真的想要覆盖先前的对象。

dat_list <- lapply(dat, FUN = function(x) x[complete.cases(x),])
df1 <- dat_list$df1
df2 <- dat_list$df2
df3 <- dat_list$df3

答案 3 :(得分:0)

或者您可以使用assign

 names1 <- paste0("df", 1:3)
 for(i in seq_along(names1)){
 x <- get(names1[i])
 x1 <- x[!(is.na(x[,1])|x[1]==''),]
 assign(names1[i], x1)
 }

  df1
  # v1 v2
 #1  1  1
 #2  2  1
 #3  3  1

 df2
 #  v11 v22
 #1   2   1
 #2   3   1
 #3   4   1
 #4   5   1