如何使用 unique 和 tidyR 拆分我的列

How to split my columns using a unique and tidyR

我正在处理一个 data.table 的专栏,如下所示:

A <- c("a;b;c","a;a;b","d;a;b","f;f;f")
df <- data.frame(A)

我想将此列分成 3 列,如下所示:

    seg1 seg2 seg3
1    a    b    c
2    a    b <NA>
3    d    a    b
4    f <NA> <NA>

这里的问题是,当我按 ";" 拆分每一行时,我需要保留该行的 unique

library(stringr)

A <- c("a;b;c","a;a;b","d;a;b","f;f;f")
df <- data.frame(A)

df <- str_split_fixed(df$A, ";", 3)
df <- apply(X = df, 
            FUN = function(x){
              return(x[!duplicated(x)][1:ncol(df)])
            }, 
            MARGIN = 1)
df <- t(df)
df <- as.data.frame(df)
names(df) <- c("seg1", "seg2", "seg3")
df

#   seg1  seg2  seg3
# 1   a     b     c
# 2   a     b  <NA>
# 3   d     a     b
# 4   f  <NA>  <NA>

这是一个 tidyverse 方法。我们将 A 中的字符拆分,仅保留 unique 值,将结果粘贴回去并将 separate 分为三列:

library(tidyverse)

df %>%
  mutate(A = map(strsplit(as.character(A), ";"), 
                 .f = ~ paste(unique(.x), collapse = ";"))) %>%
  separate(A, into = c("seg1", "seg2", "seg3"))

给出:

#  seg1 seg2 seg3
#1    a    b    c
#2    a    b <NA>
#3    d    a    b
#4    f <NA> <NA>