2017-08-10 54 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>