在数据框中过滤行,其中列值不一致。

3
我正在尝试筛选一份包含家庭信息的数据框。它看起来像这样:
 +--------+-------+---------+
 |  name  |  dad  |   mom   |
 +--------+-------+---------+
 | john   | bert  | ernie   |
 | quincy | adam  | eve     |
 | anna   | david | goliath |
 | daniel | bert  | ernie   |
 | sandra | adam  | linda   |
 +--------+-------+---------+

现在我想知道是否每个拥有相同父亲的人也有相同的母亲。我已经花了一个小时尝试不同的方法,但总是卡住。另外,我想使用 R 方法而不是一长串函数或循环来实现我想要的功能,以便学习新知识。
我的预期输出:
 +--------+------+-------+
 |  name  | dad  |  mom  |
 +--------+------+-------+
 | quincy | adam | eve   |
 | sandra | adam | linda |
 +--------+------+-------+

基本上我想要一个数据框,其中包含有多个伴侣的父亲和母亲的孩子。

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

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

我的代码到现在为止:

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

但是这不起作用,因为r说我不能以那种方式使用TRUE。

我已经更新了问题。这样更好吗? - JadaLovelace
可能是 https://dev59.com/MY3da4cB1Zd3GeqPz3CV 的重复问题。 - Ronak Shah
2个回答

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 

2

这里有一种使用 data.table 的选项。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接