如何识别R中仅包含“ MISSING”和零(“ 0”)的行的子集

时间:2019-11-02 00:13:53

标签: r dplyr

我通过将多个表连接到包含Department_id和year的主表来创建数据集。最终数据帧有很多缺失值,然后我将其归类为“ MISSING”以表示分类,将其归为“ 0”(零)以表示连续变量。

我现在想删除填充有“ MISSING”或“ 0”(即没有其他值)的行的子集,如何在R中做到这一点?

谢谢

2 个答案:

答案 0 :(得分:1)

如果可能的话,我强烈建议您离开自己的NA。 R具有内置的泛型函数,用于处理跨类的NA,可以使您的生活更加轻松。如果每种数据类型的缺失值都用不同的值表示,那么您需要为每种缺失类型添加一个比较,效率不高。

还值得一提的是,以下选项是可通用的,即它们可用于具有任意数量列的数据帧,因此您无需为每个新列添加比较。 < / p>

首先,生成一些数据进行测试:

df <- data.frame(num = c(1, 0, 3, 4, 0, 5),
                 cat = c("a", "b", "c", "d", "MISSING", "MISSING")
                 )

#### OUTPUT ####
  num     cat
1   1       a
2   0       b # <- keep
3   3       c
4   4       d
5   0 MISSING # <- drop
6   5 MISSING # <- keep

您可以使用底数R或dplyr(在其他选项中)进行过滤:

# Base R option
df[rowSums(df == "MISSING" | df == 0) < ncol(df),]

# Tidyverse option using dplyr
library(dplyr)
filter_all(df, any_vars(!(. == "MISSING" | . == 0)))

这两个选项的输出将如下所示:

  num     cat
1   1       a
2   0       b # <- kept
3   3       c
4   4       d
5   5 MISSING # <- kept

仅出于争论的目的,这是通过保持NA不变的方式简化事情的方法。首先是一些新数据:

df_na <- data.frame(num = c(1, NA, 3, 4, NA, 5),
                    cat = c("a", "b", "c", "d", NA, NA)
                    )

#### OUTPUT ####
  num  cat
1   1    a
2  NA    b # <- keep
3   3    c
4   4    d
5  NA <NA> # <- drop
6   5 <NA> # <- keep

现在,我们可以使用与上述相同的策略,但是我们只需要使用is.na(),而无需为每种类型的缺失值添加比较:

# Using base R
df_na[rowSums(is.na(df_na)) < ncol(df_na),]

# Using dplyr
library(dplyr)
filter_all(df_na, any_vars(!is.na(.)))

#### OUTPUT ####
  num  cat
1   1    a
2  NA    b # <- kept
3   3    c
4   4    d
6   5 <NA> # <- kept

答案 1 :(得分:0)

您是对的,Ott的解决方案没有做到他们所说的。这是在基数R和dplyr中正确实现的他的解决方案。请注意,您将必须为每个列重复每个!= 0子句。

# create some dummy data
data <- data.frame(
numeric = c(1, 2, 3, 0, 0, 0, 4, 5, 6),
categorical = c("MISSING", "A", "B", "MISSING", "C", "MISSING", "D", "MISSING", "E")
)

# base R solution
data[data$numeric != 0 | data$categorical != "MISSING", ]

# dplyr solution
filter(data, numeric != 0 | categorical != "MISSING")