【问题标题】:Concatenate without duplicates dataframe r连接不重复数据帧 r
【发布时间】:2017-08-06 15:29:48
【问题描述】:

我有一个数据框,我想在其中连接某些列。

我的问题是这些列中的文本可能包含也可能不包含重复信息。我想删除重复项以便仅保留相关信息。

例如,如果我有一个数据框,例如:

  Animal1         Animal2        Label  
1 cat dog         dolphin        19
2 dog cat         cat            72
3 pilchard 26     koala          26
4 newt bat 81     bat            81

您可以看到,在第 2 行中,“cat”包含在“Animal1”和“Animal2”列中。在第 3 行,数字 26 在“Animal1”和“Label”列中。而在第 4 行中,“Animal2”和“Label”列中的信息已按顺序包含在“Animal1”中。

所以通过使用粘贴功能,我可以连接列...

data1 <- paste(data$Animal1, data$Animal2, data$Label, sep = " ")

但是,我还没有设法删除重复项。我得到的输出当然只是来自我的串联:

  Output1
1 cat dog dolphin 19
2 dog cat cat 72
3 pilchard 26 koala 26
4 newt bat 81 bat 81

第 1 行很好,但其他行包含重复项,如上所述。

我想要的输出是:

  Output1
1 cat dog dolphin 19
2 dog cat 72
3 pilchard koala 26
4 newt bat 81

我尝试在连接后删除重复项。我知道在一个字符串中,您可以执行以下示例(例如Removing duplicate words in a string in R)。

d <- unlist(strsplit(data1, split=" "))
paste(d[-which(duplicated(d))], collapse = ' ')

当我只使用一个字符串时,这确实对我有用,但我无法将它应用于整个列,因为我收到一个错误“意外符号”,指的是方括号。

我已经看到还有 unique() 函数,例如Remove Duplicated String in a Row, Deleting reversed duplicates with R

reduce_row = function(i) {
  split = strsplit(i, split=", ")[[1]]
  paste(unique(split), collapse = ", ") 
}
data1$v2 = apply(data1, 1, reduce_row)

我尝试使用这些示例,但尚未成功。

非常感谢任何帮助。

【问题讨论】:

    标签: r dataframe duplicates concatenation


    【解决方案1】:

    在你完成data1 &lt;- paste(data$Animal1, data$Animal2, data$Label, sep = " ") 之后:

    data.frame(Output1 = vapply(strsplit(data1, " +"), function(x) paste(unique(x), collapse = " "), character(1)))
    #              Output1
    # 1 cat dog dolphin 19
    # 2         dog cat 72
    # 3  pilchard 26 koala
    # 4        newt bat 81
    

    【讨论】:

    • 您好,感谢您的快速回复,非常感谢。我复制了您的代码,但在 strsplit(data1, " +") 中出现错误 Error : non-character argument。如果我然后添加data1 &lt;- as.character(data1),然后尝试运行代码,它会更改为:`Output1`1 c(1, 2, 4, 3)
    • 你在做data1 &lt;- paste(data$Animal1, data$Animal2, data$Label, sep = " ")之后有没有覆盖data1
    • 那行得通,然后我得到这样的东西(我只是向你展示输出的第一行):[[1]] [1] "cat" "dog" "dolphin" "19" 但是,如果我继续下一步,我仍然得到我之前提到的错误。然后我拿出strsplit 看看是否有什么不同:data.frame(Output1 = vapply(function(x) paste(unique(x), collapse = " "), character(1))) 我得到了错误Error in get(as.character(FUN), mode = "function", envir = envir) : invalid first argument
    • 对不起,我迷失了所有这些错误。已经是哪个了? vapply(strsplit(as.character(data1$Output1), " +"), function(x) paste(unique(x), collapse = " "), character(1)) 给了什么?
    • 啊,抱歉。我的解释可能不够清楚。但是,是的,这行得通!在此之后,我得到与您的示例相同的情况。非常感谢您的帮助和耐心。深表赞赏。只是出于好奇,有没有办法以正确的顺序得到它,例如pilchard koala 26 而不是 pilchard 26 koala?也许我有太多的排序()?或者这仅仅是因为 unique 函数采用了单词/数字的第一个实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2017-01-01
    • 2013-05-05
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多