2017-08-10 45 views
0

我工作的一个data.table像这样一列分割我的专栏:如何利用独特的和tidyR

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

+0

我想并没有发现什么我” m寻找@DavidArenburg –

+1

但是OP只想要独特的结果,是不是有别于重复? –

+0

是的,你是对的。重新开放。 –

回答

1

这里有一个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> 
1
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>