【问题标题】:Unique on a dataframe with only selected columns在只有选定列的数据框中唯一
【发布时间】:2012-04-14 05:56:09
【问题描述】:

我有一个超过 100 列的数据框,我想通过只比较其中的两列来找到唯一的行。我希望这是一个简单的过程,但我无法使用 uniqueduplicated 我自己。

在下面,我想只使用 id 和 id2 来唯一:

data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))

id id2 somevalue
1   1         x
1   1         y
3   4         z

我想获得:

id id2 somevalue
1   1         x
3   4         z

或:

id id2 somevalue
1   1         y
3   4         z

(我没有偏好保留哪些唯一行)

【问题讨论】:

  • 您想要的输出没有明确定义。你如何选择包括 x 而不是 y?需要为每一个重复行的每一列做出这个决定,而你没有给出如何做的指示。
  • 我对是否包含“x”或“y”没有偏好。我会更新问题。

标签: r unique


【解决方案1】:

这里有几个dplyr 选项,它们根据列 id 和 id2 保留不重复的行:

library(dplyr)                                        
df %>% distinct(id, id2, .keep_all = TRUE)
df %>% group_by(id, id2) %>% filter(row_number() == 1)
df %>% group_by(id, id2) %>% slice(1)

【讨论】:

  • 我想没有理由考虑使用distinct的替代品
  • @Frank 也许如果有日期或其他顺序字段,则可以使用其他两个选项的组合并稍作调整,以确保保留最新的观察结果df %>% group_by(id, id2) %>% filter(date == max(date)) %>% slice(1) 而无需排序数据。 filter() 获取最近的日期,slice() 确保如果有联系,则只返回一个观察结果。在其他情况下,df %>% group_by(id, id2) %>% slice(max(row_number())) 之类的东西可能会提供更多的灵活性。你也可以在distinct() 之前使用arrange()
  • @sbha 当您要分组的列中存在平局时,是否有一种方法可以为具有特定列值的行指定首选项?对于问题中的示例,当 idid2 列中的行重复时,始终返回带有 somevalue == x 的行。
【解决方案2】:

@Joran 代码的小幅更新。
使用下面的代码,您可以避免歧义,并且只获取两列的唯一性:

dat <- data.frame(id=c(1,1,3), id2=c(1,1,4) ,somevalue=c("x","y","z"))    
dat[row.names(unique(dat[,c("id", "id2")])), c("id", "id2")]

【讨论】:

  • 这看起来与 Gary Feng 的答案相同,只是您没有包含 somevalue 结果。
【解决方案3】:

使用unique():

dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))    
dat[row.names(unique(dat[,c("id", "id2")])),]

【讨论】:

  • unique(dat[,c("id", "id2")]) 返回向量,而不是数据帧,所以你不能引用它的row.names
  • @SashkoLykhenko,你错过了最后一个逗号吗?
  • 我复制粘贴了这个row.names(unique(dat[,c("id", "id2")])),它返回了错误。最后一个逗号涉及到外部dat[...,]
【解决方案4】:

好的,如果您选择非重复列中的哪个值无关紧要,这应该很容易:

dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))
> dat[!duplicated(dat[,c('id','id2')]),]
  id id2 somevalue
1  1   1         x
3  3   4         z

duplicated 调用中,我只是传递dat 中我不想重复的那些列。此代码将始终自动选择任何模棱两可的值的first。 (在这种情况下,x。)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多