【问题标题】:R select all rows from a dataframe where a value is duplicated one column but has a specific value in another columnR从数据框中选择所有行,其中值在一列中重复但在另一列中具有特定值
【发布时间】:2019-07-02 04:09:14
【问题描述】:

我正在尝试从我的 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 中重复的所有行,其中 timepoint = 0 表示一次出现的值,1 表示另一次出现,导致

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

请注意,最后两项数据在 X 中也是重复的,因为在这两种情况下时间点变量都是 1,所以不计算在内。 有一个 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,]

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

【问题讨论】:

  • 使用拆分并测试每个子 dfrm 中是否存在 0 和 1。

标签: r dataframe dplyr duplicates subset


【解决方案1】:

这是你要找的吗?

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))

【讨论】:

  • 谢谢,它有效!只是为了让我理解它是如何工作的,你能解释一下这段代码在做什么吗?
猜你喜欢
  • 1970-01-01
  • 2013-01-02
  • 2015-11-21
  • 2022-07-18
  • 2017-02-14
  • 2012-02-24
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多