R从数据框中选择所有行,在该数据框中,一个值重复一列,但在另一列中具有特定值

时间:2019-02-07 22:52:51

标签: r dataframe dplyr duplicates subset

我正在尝试从R数据框中提取一行中具有重复值但另一列中具有0或1的行。

例如,如果这是数据帧:

Data <- data.frame(
+     X = c(1,3,5,7,7,8,9,10,10,11,11),
+     Y = sample(36476545:36476555),
+ timepoint = c(0,1,0,0,1,1,0,1,0,1,1)
+ )

类似于

> Data
    X        Y timepoint
1   1 36476549         0
2   3 36476545         1
3   5 36476552         0
4   7 36476547         0
5   7 36476546         1
6   8 36476548         1
7   9 36476551         0
8  10 36476555         1
9  10 36476553         0
10 11 36476554         1
11 11 36476550         1

我想要的输出将是所有值都在X中重复的行,其中一次出现该值的时间点= 0,另一次出现的时间点= 1,结果

> Data
    X        Y timepoint
4   7 36476547         0
5   7 36476546         1
8  10 36476555         1
9  10 36476553         0

请注意,由于这两种情况下的时间点变量均为1,因此也不会计算在X中重复的最后两个数据。 有一个solution in SQL接近,但我不知道如何在R中进行编码。

解决方案,我首先尝试创建重复项的数据框,然后尝试从那里获取我想要的数据框:

dupes <- Data[Data$X %in% 
Data$X[duplicated(Data$X)],]
ids <- Data$X[Data$timepoint==0]
Data[Data$X %in% ids,]

但是这将返回没有重复条目的行。任何帮助,将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:2)

是您要找的吗?

library(dplyr)

Data <- data.frame(
     X = c(1,3,5,7,7,8,9,10,10,11,11),
     Y = sample(36476545:36476555),
 timepoint = c(0,1,0,0,1,1,0,1,0,1,1)
 )

Data %>% 
  group_by(X) %>% 
  filter(dplyr::n_distinct(timepoint) == 2)

n_distinct返回向量中不同元素的数量。由于使用group by语句,因此仅返回每个组(X)具有两个不同时间点的行。

dplyr::n_distinct(c(1, 2, 1, 3, 1))

Data %>% 
  group_by(X) %>% 
  mutate(n_distinct = dplyr::n_distinct(timepoint))