过滤data.frame中列值不一致的行

时间:2019-10-09 09:36:15

标签: r dataframe

我正在尝试使用家庭信息过滤data.frame。看起来像这样:

 +--------+-------+---------+
 |  name  |  dad  |   mom   |
 +--------+-------+---------+
 | john   | bert  | ernie   |
 | quincy | adam  | eve     |
 | anna   | david | goliath |
 | daniel | bert  | ernie   |
 | sandra | adam  | linda   |
 +--------+-------+---------+

现在我想知道是否每个人都有相同的父亲,也有相同的妈妈。我已经花了一个小时尝试各种方法,但是我一直陷于困境。另外,我想使用R方法,而不要使用冗长的函数或for循环序列来在技术上满足我的需要,而无需学习任何新知识。

我的预期输出:

 +--------+------+-------+
 |  name  | dad  |  mom  |
 +--------+------+-------+
 | quincy | adam | eve   |
 | sandra | adam | linda |
 +--------+------+-------+

基本上,我希望有一个data.frame,其中包含有来自多个合作伙伴的孩子的爸爸妈妈。

到目前为止,我的方法是:

  1. 通过父亲列拆分df
  2. 从生成的dfs列表中删除仅一行的所有dfs(这里我已经卡住了,无法使其工作)
  3. 删除所有nrow(unique(df $ mom))= 1的dfs
  4. 得到的清单应该给我所有具有不同父母的兄弟姐妹。

到目前为止我的代码:

 fraternals <- split(kinship, kinship$father)
 fraternals <- fraternals[-which(lapply(fraternals, function(x) if(nrow(x) == 1) { output TRUE }))]

但这不会运行,因为r表示我不能以这种方式使用TRUE。

2 个答案:

答案 0 :(得分:3)

一种dplyr可能是:

df %>%
 group_by(dad) %>%
 filter(n_distinct(mom) != 1)

  name   dad   mom  
  <chr>  <chr> <chr>
1 quincy adam  eve  
2 sandra adam  linda

如果您不想过滤但想查看此信息:

df %>%
 group_by(dad) %>%
 mutate(cond = n_distinct(mom) != 1)

  name   dad   mom     cond 
  <chr>  <chr> <chr>   <lgl>
1 john   bert  ernie   FALSE
2 quincy adam  eve     TRUE 
3 anna   david goliath FALSE
4 daniel bert  ernie   FALSE
5 sandra adam  linda   TRUE 

答案 1 :(得分:1)

这里是使用data.table

的选项
library(data.table)
setDT(df)[, .SD[uniqueN(mom) != 1], .(dad)]