【问题标题】:remove duplicate entries in every row删除每一行中的重复条目
【发布时间】:2017-11-23 06:08:52
【问题描述】:

我有一个看起来像这样的数据框

1 TSS1500
2 Body;TSS1500
3 Body;Body;Body

我想从每一行中删除重复的条目,使其看起来像这样

1 TSS1500
2 Body;TSS1500
3 Body

非常感谢您的帮助。

【问题讨论】:

  • 在您的问题中包含minimal reproducible example 会增加您获得答案的机会。
  • 可重现的示例会有所帮助,但是,请查看此示例并删除 NA:stackoverflow.com/questions/42142260/…
  • x
  • 非常感谢我能够使用 df = cSplit(data, "col1", sep = ";") 进行分离。然后 df = t(apply(df, 1, FUN = function(x) replace(x, duplicated(x), NA)))

标签: r duplicates row


【解决方案1】:

看起来您的数据框只有两列。第一列是从 1 到 3 的 ID,而第二列包含字符串。每个字符串都包含“;”分隔单词并且您想删除重复的单词。

我相信您在评论中提出的cSplit 可能来自splitstackshape 包,是一个好方法。用“;”分割单词后,就可以使用Zen先生帖子中的解决方案了。

这里我提供了另一种使用dplyrtidyr 的方法。这个想法是使用separate_row 通过拆分; 来“扩展”每条记录。之后,group_bydistinct 可以删除这些重复项。最后一步,summarisepaste0 并设置 collapse = ";",允许我们将数据框转换回原始格式。

### Create example data frame
dt <- read.table(text = "1 TSS1500
2 'Body;TSS1500'
                 3 'Body;Body;Body'",
                 header = FALSE, stringsAsFactors = FALSE)
dt

#   V1             V2
# 1  1        TSS1500
# 2  2   Body;TSS1500
# 3  3 Body;Body;Body

# Load packages
library(dplyr)
library(tidyr)

dt2 <- dt %>%
  # Expland each record by spliting ";"
  separate_rows(V2) %>%
  # Grouping based on V1
  group_by(V1) %>%
  # Remove duplicated rows
  distinct(V2) %>%
  # Combine rows from the same group together
  summarise(V2 = paste0(V2, collapse = ";"))
dt2
# # A tibble: 3 x 2
#      V1           V2
#   <int>        <chr>
# 1     1      TSS1500
# 2     2 Body;TSS1500
# 3     3         Body  

下次如果你想问一个新问题,请考虑使用dput或其他方式分享一个最小且可重复的。这可以让其他人更好地帮助您。您可以通过查看您发布的示例看到,它是数据框还是您拥有多少列并不完全清楚。重新创建数据集也需要额外的时间,并且不能保证重新创建的数据集与您的数据集相同。

【讨论】:

    猜你喜欢
    • 2014-04-15
    • 2015-11-24
    • 2014-08-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多