【问题标题】:Select multiple duplicate rows based on specific values in next column根据下一列中的特定值选择多个重复行
【发布时间】:2016-09-30 17:51:32
【问题描述】:

这是 Kikapp 的answer 的后续问题。

我想删除缺少所有时间点的参与者 ID。换句话说,我想选择所有四个时间(11、21、31、41)的行。见样本数据dropbox link

这是我根据 Kikapp 的回答进行的尝试。由于某种原因,它不起作用。让我知道如何让它变得更好。

data2 <- df[df$ID %in% names(table(df$ID))[table(df$ID) > 3],] 

time == 11time == 21time == 41 得到 4695 行或对象或 ID,而 time == 31 得到 4693 个;但是,我希望它们应该是平等的。

【问题讨论】:

  • 试试:do.call(rbind,Filter(function(x) { length(unique(x[,2])) == 4 },split(df, df$ID))).
  • df %&gt;% group_by(ID) %&gt;% dplyr::filter(length(unique(time)) == 4) %&gt;% data.frame()dplyr
  • @Abdou - 谢谢!第一个代码不起作用。第二个给出与我的 data2 代码相同的结果。我用time==31 少了两行。实际上,所有四个时间点(11、21、31、41)都应该具有相同数量的 ID 或行或对象。使用data2 &lt;- df[df$ID %in% names(table(df$ID))[table(df$ID) &gt; 3],] 代码或您的df %&gt;% group_by(ID) %&gt;% dplyr::filter(length(unique(time)) == 4) %&gt;% data.frame() 代码,我得到 4695 行或对象或 ID,分别为 11、21,41,而 4693 为 31 次。
  • 我提供的两个代码 sn-ps 都做同样的事情,所以我不确定“第一个代码不起作用”是什么意思。看起来您的数据中有 2 行的 time 值为 32。您没有提到 time 的值为 32 的行。
  • 我会写一个答案来解释我如何发现有32的行。

标签: r duplicates unique


【解决方案1】:

您可以使用dplyr 完成此任务以获得更快的结果:

df1 <- df %>% group_by(ID) %>% 
    dplyr::filter(length(unique(time)) == 4) %>% 
    data.frame()

但是,当您获得每个 time 值的 ID 的计数时,您会发现那里隐藏了 32(总共 2 行):

df1 %>% group_by(time) %>% 
    dplyr::summarise(Counts = n()) %>% 
    data.frame()

#Output:
time Counts
 11   4695  
 21   4695  
 31   4693  
 32      2  
 41   4695 

这表明您有 2 行的值为 32。事实证明,这是由于您的拼写错误造成的。因此,您可以使用df$time[df$time == 32] &lt;- 31 更改它们并再次运行代码。

我希望这会有所帮助。

谢谢!

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    相关资源
    最近更新 更多