删除R中具有指定值的所有单元格

时间:2016-05-16 16:26:02

标签: r dataframe

这是一个数据框:

df <- data.frame('a' = c('NULL',1,4,5), 'b' = c(5,6,3,'NULL'), 'c' = c(9,'NULL',9,3))

输出:

     a    b    c
1 NULL    5    9
2    1    6 NULL
3    4    3    9
4    5 NULL    3

我要做的是删除所有具有空值的单元格。一种方法是这样的:

df2 <- data.frame('a' = subset(df, !(a == 'NULL'))$a, 
                 'b' = subset(df, !(b == 'NULL'))$b,
                 'c' = subset(df, !(c == 'NULL'))$c)

输出:

  a b c
1 1 5 9
2 4 6 9
3 5 3 3

然而,这是低效的。有没有删除任何具有空值的单元格?

2 个答案:

答案 0 :(得分:2)

as.data.frame(sapply(df, function(x) x[x != "NULL"]))
#   a b c
# 1 1 5 9
# 2 4 6 9
# 3 5 3 3

从此链接How to clean or remove NA values from a dataset without remove the column or row

由于它不是完全重复,因此添加了答案

答案 1 :(得分:1)

另一个提供相同答案的解决方案,但如果每列中有不同数量的“NULL”值,也可以使用:

#Works for original problem
df <- data.frame('a' = c('NULL',1,4,5), 'b' = c(5,6,3,'NULL'), 'c' = c(9,'NULL',9,3))
res<-as.data.frame(sapply(df, function(x) {
                                      c(as.numeric(levels(x))[x[x != "NULL"]],
                                        rep("NULL",sum(x == "NULL")))
                                      }))
res2 <- res[rowSums(res=="NULL")==0,]    

res2
#  a b c
#1 1 5 9
#2 4 6 9
#3 5 3 3

现在举一个例子,每列中有不同数量的“NULL”:

df <- data.frame('a' = c('NULL',1,4,5,6), 'b' = c("NULL",6,3,'NULL',7), 'c' = c(9,'NULL',"NULL","NULL",10))
res<-as.data.frame(sapply(df, function(x) {
                                      c(as.numeric(levels(x))[x[x != "NULL"]],
                                        rep("NULL",sum(x == "NULL")))
                                      }))
res2 <- res[rowSums(res=="NULL")==0,]       

res2
#  a b  c
#1 1 6  9
#2 4 3 10