Объединить выбранные значения по столбцам в один столбец - PullRequest
1 голос
/ 05 мая 2020

У меня есть фрейм данных df, где:

 a  b  c  d
 4  K  12 6
 6  L  K  P
 7  3  P  1
 0  L  90 K
 1  P  4  5
 0  K  17 23

Как мне объединить два столбца b, c и d в новый столбец с именем x, чтобы он сохраняет только буквы K, L и P, чтобы они выглядели так:

 a  x  
 4  K  
 6  L, K, P
 7  P
 0  L, K 
 1  P
 0  K

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Мы можем использовать unite с separate_rows. unite столбцы 'b', 'c', 'd' в один столбец 'x', затем разделите столбец по разделителю по умолчанию (_) на separate_rows при создании уникального идентификатора строки с row_number, затем filter строки, в которых есть элементы 'K', 'L', 'P', сгруппированные по 'rn', summarise по paste с добавлением unique элементов в 'x'

library(dplyr)
library(tidyr)
df %>%
   unite(x, b, c, d) %>%
   mutate(rn = row_number()) %>%
   separate_rows(x) %>%
   filter(x %in% c("K", "L", "P")) %>%
   group_by(rn) %>%
   summarise(a = first(a), x = toString(unique(x))) %>%
   select(-rn)
# A tibble: 6 x 2
#      a x      
#  <int> <chr>  
#1     4 K      
#2     6 L, K, P
#3     7 P      
#4     0 L, K   
#5     1 P      
#6     0 K     

Или другой вариант: pivot_longer

df %>% 
   mutate(rn = row_number()) %>% 
   pivot_longer(cols = b:d, values_to = 'x') %>% 
   filter( x %in% c("K", "L", "P")) %>% 
   group_by(rn) %>% 
   summarise(a = first(a), x = toString(unique(x))) %>%
   select(-rn)

данные

df <- structure(list(a = c(4L, 6L, 7L, 0L, 1L, 0L), b = c("K", "L", 
"3", "L", "P", "K"), c = c("12", "K", "P", "90", "4", "17"), 
    d = c("6", "P", "1", "K", "5", "23")), class = "data.frame", 
    row.names = c(NA, 
-6L))
1 голос
/ 19 мая 2020

Другим решением было бы исключить все числа

df %>% 
  mutate(x = purrr::pmap_chr(list(b,c,d),
                             ~ paste0(c(..1, ..2, ..3) %>% 
                                        .[!grepl("^[0-9]{1,}$", .)], 
                                      collapse = ", ")))

или оставить только K, L и P

df %>% 
  mutate(x = purrr::pmap_chr(list(b,c,d),
                             ~ paste0(c(..1, ..2, ..3) %>% 
                                        .[. %in% c("K","L","P")], 
                                      collapse = ", ")))
...