我想从数据框中删除与特定变量组合相对应的行。
这里有一个虚拟数据:
father<- c(1, 1, 1, 1, 1)
mother<- c(1, 1, 1, NA, NA)
children <- c(NA, NA, 2, 5, 2)
cousins <- c(NA, 5, 1, 1, 4)
dataset <- data.frame(father, mother, children, cousins)
dataset
father mother children cousins
1 1 NA NA
1 1 NA 5
1 1 2 1
1 NA 5 1
1 NA 2 4
我想过滤这一行:
father mother children cousins
1 1 NA NA
我可以这样做:
test <- dataset %>%
filter(father==1 & mother==1) %>%
filter (is.na(children)) %>%
filter (is.na(cousins))
test
我的问题是:我有很多列,比如grand father,uncle1,uncle2,uncle3,我想避免这样的事情:
filter (is.na(children)) %>%
filter (is.na(cousins)) %>%
filter (is.na(uncle1)) %>%
filter (is.na(uncle2)) %>%
filter (is.na(uncle3))
and so on...
我怎么能用dplyr说过滤所有列与na(除了父亲==1 &母亲==1)
6条答案
按热度按时间slmsl1lt1#
一个可能的
dplyr
(0.5.0.9004 <= version < 1.0)解决方案是:说明:
vars(-father, -mother)
:选择除father
和mother
之外的所有列。all_vars(is.na(.))
:保留is.na
为TRUE
的行,用于所有所选列。注意:如果要保留
is.na
是TRUE
的行,则应使用any_vars
而不是all_vars
。更新(2020-11-28)
由于
_at
函数和vars
从dplyr 1.0起已被across
取代,现在推荐使用以下方法(或类似方法):查看更多
across
的示例以及如何使用新方法重写以前的代码:Colomn-wise operatons或在安装最新版本的dplyr
后在R中键入vignette("colwise")
。yk9xbfzb2#
dplyr >= 1.0.4
如果你使用的是dplyr version >= 1.0.4,你真的应该使用
if_any
或if_all
,它专门将 predicate 函数的结果组合到一个逻辑向量中,使其在filter
中非常有用。语法与across
相同,但添加了以下动词以帮助满足此需求:if_any/if_all。这里我已经写出了变量名,但是你可以使用任何tidy selection helper来指定变量(例如,按名称或位置的列范围,正则表达式匹配,子字符串匹配,开始/结束等)。
输出
omhiaaxx3#
没有一个答案似乎是一个适应性强的解决方案。我认为这样做的目的不是列出所有的变量和值来过滤数据。
实现这一点的一个简单方法是合并。如果你有df_filter中的所有条件,那么你可以这样做:
zwghvu4y4#
dplyr
解决方案:其中'2'是应该为
NA
的列数。这给出:
你也可以在R中应用这个逻辑:
fykwrbwg5#
这里是一个使用两个
Reduce
函数和[
子集的基R方法。每个
Reduce
连续接受提供的变量并执行逻辑检查。这两个结果用&
连接。可以调整Reduce
函数的第二个参数,以包含您想要的data.frame中的任何变量。然后使用逻辑向量进行子集
pbossiut6#
这个答案基于@Feng Jiang的答案,使用
dplyr::left_joint()
操作,更像是一个reprex。此外,它确保在df_filter中的变量顺序与原始数据集中的变量顺序不同的情况下恢复列的正确顺序。此外,针对重复组合扩展数据集,以显示这些是过滤输出(df_out)的一部分。