簡體   English   中英

將跨列的選定值合並為一列

[英]Combine selected values across columns into one column

我有一個 dataframe 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

如何將兩列bcd合並到一個名為x的新列中,這樣它只保留字母KLP看起來像這樣:

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

我們可以將uniteseparate_rows一起使用。 將列 'b'、'c'、'd' unite為單個列 'x',然后在默認分隔符 ( _ ) 處使用separate_rows的行拆分列,同時使用row_number創建唯一的行 ID,然后filter我們所在的行有 'K', 'L', 'P' 元素,按 'rn' 分組,通過paste 'x' 中的unique元素進行summarise

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))

如果您想排除所有數字,另一種解決方案是

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 = ", ")))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM