我正在尝试将每个数据框子集,以排除第一列为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
答案 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