删除数据框中列中所有值的字符串中的重复值

时间:2017-10-28 00:08:43

标签: r

我有一个像df这样的数据框。

c1 <- c(4, 3, 6, 5, 2)
c2 <- c("AAA, AAA, VAA, LLA", "CEA, CEA, HEA, CKA, NEA, TEA", "RFA, LIA, VIA, CIA, CIA, RKA", "JHD, JKE, JKE, HGH", "JII, JII, ISA, KSA")
df <- data.frame(c1, c2)

我想删除第二列中值的任何重复项。因此,例如,它应该删除第二列中的“AAA”之一,以获得对应于“4”(第一行)的值。如何对第二列中的所有单元格进行此操作?

谢谢!

1 个答案:

答案 0 :(得分:1)

更新了解决方案

正如@RichScriven在评论中正确指出的那样,原始c2是一个因素列。

levels(df$c2)
#> [1] "AAA, AAA, VAA, LLA"           "CEA, CEA, HEA, CKA, NEA, TEA"
#> [3] "JHD, JKE, JKE, HGH"           "JII, JII, ISA, KSA"          
#> [5] "RFA, LIA, VIA, CIA, CIA, RKA"

要更新因子级别,我们可以执行以下操作:

library(purrr)
library(stringr)

levels(df$c2) <- map_chr(str_split(levels(df$c2), boundary("word")),
                         function(x) paste0(unique(x), collapse = ", "))

这给了我们:

levels(df$c2)

#> [1] "AAA, VAA, LLA"           "CEA, HEA, CKA, NEA, TEA"
#> [3] "JHD, JKE, HGH"           "JII, ISA, KSA"          
#> [5] "RFA, LIA, VIA, CIA, RKA"

df
#>   c1                      c2
#> 1  4           AAA, VAA, LLA
#> 2  3 CEA, HEA, CKA, NEA, TEA
#> 3  6 RFA, LIA, VIA, CIA, RKA
#> 4  5           JHD, JKE, HGH
#> 5  2           JII, ISA, KSA

原始解决方案(添加新列表列而不是更新因子级别)

对于tidyverse方法,您可以执行以下操作,将结果放入新列c3

library(dplyr)
library(purrr)
library(stringr)

mutate(df, c3 = map(str_split(c2, boundary("word")), unique))
#>   c1                           c2                      c3
#> 1  4           AAA, AAA, VAA, LLA           AAA, VAA, LLA
#> 2  3 CEA, CEA, HEA, CKA, NEA, TEA CEA, HEA, CKA, NEA, TEA
#> 3  6 RFA, LIA, VIA, CIA, CIA, RKA RFA, LIA, VIA, CIA, RKA
#> 4  5           JHD, JKE, JKE, HGH           JHD, JKE, HGH
#> 5  2           JII, JII, ISA, KSA           JII, ISA, KSA

我相当肯定在其他人可以提供的基础R中也可以做到这一点。