我有一个像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”(第一行)的值。如何对第二列中的所有单元格进行此操作?
谢谢!
答案 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中也可以做到这一点。