我通过将多个表连接到包含Department_id和year的主表来创建数据集。最终数据帧有很多缺失值,然后我将其归类为“ MISSING”以表示分类,将其归为“ 0”(零)以表示连续变量。
我现在想删除填充有“ MISSING”或“ 0”(即没有其他值)的行的子集,如何在R中做到这一点?
谢谢
答案 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")