【问题标题】:Remove duplicates in cells from specific columns in R?从R中的特定列中删除单元格中的重复项?
【发布时间】:2021-07-01 08:46:00
【问题描述】:

我有一个包含重复字符或数字的数据框。我想创建一个新的 df ,它只在这些列中的每一列中包含唯一的单元格。下面是我想要实现的目标的视觉效果。任何想法都将受到高度赞赏。

【问题讨论】:

  • 请提供一个可重现的最小示例:请参见此处:stackoverflow.com/help/minimal-reproducible-example>
  • 使用包dplyr的函数distinct
  • 谢谢马科斯。但是,如何在特定列中使用 distinct 来保持该行的每个单元格中的唯一结果?

标签: r unique rows bioinformatics numeric


【解决方案1】:

这样做。使用 df created by ChrisRuehlemann

library(tidyverse)
df %>% mutate(across(everything(), ~str_split(., ",")),
              across(everything(), ~map(., ~unique(.x))))
               Title   Length    Prediction
1             George 555, 666           111
2 Kate, Alice, Peter 123, 444 222, 333, 777

或单线

mutate(df, across(everything(), ~map(str_split(., ","), ~unique(.x))))

               Title   Length    Prediction
1             George 555, 666           111
2 Kate, Alice, Peter 123, 444 222, 333, 777

【讨论】:

  • 非常感谢!使用此解决方案时的唯一问题是它以 c("", "", "") 的格式为具有不同值的行提供它,例如在它之前是:765、765、837、837、837 , 762, 762 然后在您建议的代码之后变成: c("765", "837", "762")
  • 您有什么建议可以解决,不要以这种格式包含它吗?
  • 这个可以解决。请给出示例数据而不是图像。
【解决方案2】:

这是一个正则表达式解决方案(基于在没有可重现数据的情况下的模拟数据):

library(stringr)
df[,1:3] <- lapply(df[,1:3], function(x) str_extract_all(x, "(\\b\\w+\\b)(?!.*\\1)"))

解决方案采用负前瞻 ((?!...)) 和反向引用 (\\1):模式 (\\b\\w+\\b)(?!.*\\1) 用于 str_extract_all 字母数字字符串除非它们在字符串后面重复 ,它有效地捕获了所有唯一值:

结果:

df
               Title   Length    Prediction
1             George 555, 666           111
2 Alice, Peter, Kate 123, 444 333, 777, 222

数据:

df <- data.frame(
  Title = c("George,George,George", "Kate,Alice,Kate,Peter,Kate"),
  Length = c("555,555,666", "123,123,444,123,444"), 
  Prediction = c("111,111,111", "222,333,222,777,222"), stringsAsFactors = F)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-11
    • 2021-07-16
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2014-11-11
    • 2020-11-07
    • 2021-11-18
    相关资源
    最近更新 更多