将列与唯一值结合在一起

时间:2018-07-21 09:02:41

标签: r dplyr

说我有一个像这样的数据框:

test <- data.frame(x = c('v01','v02','v03'),
                   y = c('v01','v05','v06'),
                   z = c('v03', 'v03','v08'))

我可以用tidyverse pacakge合并x:z列:

test %>% 
  as.tbl %>%
  unite(new_col, x:y:z, sep = ',', remove = F)

这是结果:

  new_col     x     y     z    
  <chr>       <fct> <fct> <fct>
1 v01,v01,v03 v01   v01   v03  
2 v02,v05,v03 v02   v05   v03  
3 v03,v06,v08 v03   v06   v08 

但是我想要的是唯一值,例如第一行只有'v01,v03':

  new_col     x     y     z    
  <chr>       <fct> <fct> <fct>
1 v01,v03     v01   v01   v03  
2 v02,v05,v03 v02   v05   v03  
3 v03,v06,v08 v03   v06   v08 

有帮助吗?

3 个答案:

答案 0 :(得分:4)

另一种方法,您可以不使用unite而在一行中完成操作:

test$new_col <- apply(test, 1, function(x) paste(unique(x), collapse = ','))

答案 1 :(得分:2)

采用新列,并用sep =“,”对其进行拆分。然后只抓取蚂蚁粘贴的唯一元素:

test <- data.frame(x = c('v01','v02','v03'),
                   y = c('v01','v05','v06'),
                   z = c('v03', 'v03','v08'))

test = test %>% unite(new_col, x:z, sep = ',', remove = F)
test$new_col = sapply(strsplit(test$new_col, ","), 
                      function(x) new_col = paste(unique(x), collapse = ","))

答案 2 :(得分:0)

我们将列更改为character类,使用pmap(来自purrr)来获取每行unique个元素,并将它们paste一起

library(tidyverse)
test %>% 
  mutate_all(as.character) %>% 
  pmap_chr(~ c(...) %>% 
                 unique %>% 
                 toString) %>% 
  bind_cols(new_col = ., test)
# A tibble: 3 x 4
#  new_col       x     y     z    
#  <chr>         <fct> <fct> <fct>
#1 v01, v03      v01   v01   v03  
#2 v02, v05, v03 v02   v05   v03  
#3 v03, v06, v08 v03   v06   v08