【问题标题】:pick up specific rows from duplicates on a dataframe with only selected columns从只有选定列的数据框中的重复项中提取特定行
【发布时间】:2014-12-10 00:29:55
【问题描述】:

这与之前在 SO 中回答的问题略有不同。 (Unique on a dataframe with only selected columns)

该问题与我的唯一区别是我必须提及应保留重复项中的哪些特定行。我的行是我正在考虑的名称,例如提供一个子字符串来删除具有该子字符串的行,但我无法将其放入代码中。例如:如果重复行是 exm123 和 tre123,我想保留带有 tre 子字符串的行)

如果你们认为在 R 中没有任何子字符串有更简单的方法来做同样的事情,我很乐意学习替代方法。谢谢。

  dat:    
  Index Name      id1   id2
  1 exm-9980        1   202183358
  2 exm-53487       1   203186865
  3 exm-tre10248    1   85537661
  4 exm-7747       10   102827758
  5 exm-29639      10   18289634
  6 exm-76467      10   27436462
  7 exm-tre7540    10   18289634
  8 exm-4560589    10   74890584
  9 vg-194357      11   102589148
  10 exm-0867390   11   61110815
  11 exm-IN3127     1   85537661
  12 exm-tre2315   11   18632984
  13 exm-12411      6   30332555
  14 exm-128711    11   18632984

nm1 <- c('id1', 'id2')           
indx <- duplicated(dat[,nm1])|duplicated(dat[,nm1],fromLast=TRUE)    
df22=dat[!indx|(indx & grepl("^tre", dat$Name)),]    
which(indx==T)       

indx: 3,5,7,12.14,11,13        

当我使用索引 13 的主数据中的 id1 和 id2 的值进行交叉检查时
f1=dat[dat$id1==6& dat$id2==30332555,]
f1 是 1 行的矩阵。如果它是重复的,它应该是第 2 行或更多行的矩阵。

我无法加载完整的数据,因为它超过了 100k 行。但我希望这将有助于以清晰的方式显示问题。

【问题讨论】:

  • 请提供您的数据的一小部分样本,并显示您期望的结果。
  • @user2698508 假设是否有重复,并且它们都以tre 开头(如我的示例所示)。那么,你会保留哪一个?
  • @user2698508 我使用之前的代码从你的新示例中得到了预期的结果
  • @user2698508 在新数据集中,exmtrm 在单个 Name 行中。在这里,哪一行应该在预期的输出中。
  • @user2698508 还有grepl(^rs", dat$Name),我在名称列中找不到rs 作为起始字符。

标签: r unique


【解决方案1】:

使用示例数据集:

 nm1 <- c('id1', 'id2')
 indx <- duplicated(dat[,nm1])|duplicated(dat[,nm1], fromLast=TRUE)

dat[!indx|(indx & grepl("^tre", dat$Name)),] 
 #   Index      Name id1    id2
 #1     1 exm-49980   1   2021
 #2     2  exm-3487   1  20318
 #3     3  exm-0248   1   8553
 #4     4 exm-17747  10 102827
 #5     5 exm-29639  10  18289
 #7     7  tre-2987  10  27436
 #8     8  vg-18999  18 279990

数据

 dat <- structure(list(Index = 1:8, Name = c("exm-49980", "exm-3487", 
 "exm-0248", "exm-17747", "exm-29639", "exm-6467", "tre-2987", 
 "vg-18999"), id1 = c(1L, 1L, 1L, 10L, 10L, 10L, 10L, 18L), id2 = c(2021L, 
 20318L, 8553L, 102827L, 18289L, 27436L, 27436L, 279990L)), .Names = c("Index", 
 "Name", "id1", "id2"), class = "data.frame", row.names = c(NA, 
-8L))

更新

 nm1 <- c('id1', 'id2')
 indx <- duplicated(dat[,nm1])|duplicated(dat[,nm1], fromLast=TRUE)

 dat1 <- dat[!indx|(indx&grepl("-tre", dat$Name)),] #check the `grepl`.  The pattern is changed as per the new example.  Here, the `Name` no longer starts with `tre`.
 dat1
 #    Index         Name id1       id2
 #1      1     exm-9980   1 202183358
 #2      2    exm-53487   1 203186865
 #3      3 exm-tre10248   1  85537661
 #4      4     exm-7747  10 102827758
 #6      6    exm-76467  10  27436462
 #7      7  exm-tre7540  10  18289634
 #8      8  exm-4560589  10  74890584
 #9      9    vg-194357  11 102589148
 #10    10  exm-0867390  11  61110815
 #12    12  exm-tre2315  11  18632984
 #13    13    exm-12411   6  30332555

数据

 dat <- structure(list(Index = 1:14, Name = c("exm-9980", "exm-53487", 
 "exm-tre10248", "exm-7747", "exm-29639", "exm-76467", "exm-tre7540", 
 "exm-4560589", "vg-194357", "exm-0867390", "exm-IN3127", "exm-tre2315", 
 "exm-12411", "exm-128711"), id1 = c(1L, 1L, 1L, 10L, 10L, 10L, 
 10L, 10L, 11L, 11L, 1L, 11L, 6L, 11L), id2 = c(202183358L, 203186865L, 
 85537661L, 102827758L, 18289634L, 27436462L, 18289634L, 74890584L, 
 102589148L, 61110815L, 85537661L, 18632984L, 30332555L, 18632984L
 )), .Names = c("Index", "Name", "id1", "id2"), class = "data.frame", row.names = c(NA, 
 -14L))

【讨论】:

  • 嗨 Akrun,在这种情况下,我可以保留任何内容,但我还没有遇到具有相同前缀的重复行。我无法理解代码的 dat[!indx |(indx & grepl("^tre", row.names(dat))),] 行,我看到结果仍然有 exm。你能告诉我吗?和 ^ 用于此行,它将帮助我相应地修改代码。我在 grepl 的语法中找不到它。
  • @user2698508 我只是根据您提到的内容创建数据集。另外,我查看了您显示的链接。所以,基本上,我的理解是,你想对所有非重复行进行子集化,如果有任何重复行,那么取一个以rownames 开头的以tre 开头的行。在这里,在这种情况下,exm145 行是非重复的。如果您显示示例数据集和预期结果可能会更好,这样可以减少混乱。
  • 是的,你做得很完美。 :) 我应该对非重复行进行子集化,对于重复行,我应该保留行名中没有 exm 前缀的行。例如:exm123、tre123、exm145、tre133、vg189 是我的行名,exm123、tre123、vg189 是不重复的。 exm145,tre133 是重复的,然后我保留 tre133。希望能举个例子说的更清楚。
  • 我尝试了更新的代码。它适用于某些索引,但不适用于某些索引。我发现 indx 中的某些值(即行号)在我的数据中不是重复的。这些索引只有一行具有 id1 和 id2 组合。
  • @user2698508 从您的描述中不清楚。在您提供的示例中,id1 和 id2 组合只有一行,即第 1:5 和第 8 行。
猜你喜欢
  • 1970-01-01
  • 2017-02-03
  • 2012-04-22
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
相关资源
最近更新 更多