如何将同一行中以逗号分隔的值拆分到R中的不同行

Lar*_*ury 5 split r dataframe mutate

我有一些来自Google 表单的数据,我想插入常用分隔的答案复制参与者的 ID

  • 数据如下:
> head(data)
   names         Q2               Q3                          Q4
1 PART_1     fruits    bananas, apples        brocolli, lettuce, potatoes
2 PART_2 vegetables   bananas, oranges                    brocolli
3 PART_3     fruits                        carrots, brocolli, lettuce
Run Code Online (Sandbox Code Playgroud)
  • 所需输出#1(用 Nas 填充):
 names         Q2               Q3                          Q4
1 PART_1     fruits        bananas                brocolli  
  PART_1       NA          apples                 lettuce,
  PART_1       NA           NA                    potatoes
so on...
Run Code Online (Sandbox Code Playgroud)
  • 所需输出#2(重复非多项选择答案(如 Q1):
 names         Q2               Q3                          Q4
1 PART_1     fruits        bananas                   brocolli  
  PART_1     fruits           apples                 lettuce,
  PART_1     fruits           NA                    potatoes
so on...
Run Code Online (Sandbox Code Playgroud)
  • 如果可能的话,tidyverse解决方案将不胜感激!

Obs:这个想法很像这个 SQL 问题我看过这个 R 问题,但我想重复参与者的名字,而不是重命名他们

  • 数据:
structure(list(names = c("PART_1", "PART_2", "PART_3"), Q2 = c("fruits", 
"vegetables", "fruits"), Q3 = c("bananas, apples", "bananas, oranges", 
""), Q4 = c("brocolli, lettuce, potatoes", "brocolli", "carrots, brocolli, lettuce"
)), class = "data.frame", row.names = c(NA, -3L))
Run Code Online (Sandbox Code Playgroud)

H 1*_*H 1 7

你可以做:

\n
library(tidyr)\nlibrary(dplyr)\n\ndat %>% \n  pivot_longer(-c(Q2, names)) %>%\n  separate_rows(value) %>%\n  group_by(names, name) %>%\n  mutate(row = row_number()) %>%\n  pivot_wider() %>%\n  select(-row)\n\n# A tibble: 8 \xc3\x97 4\n# Groups:   names [3]\n  names  Q2         Q3        Q4      \n  <chr>  <chr>      <chr>     <chr>   \n1 PART_1 fruits     "bananas" brocolli\n2 PART_1 fruits     "apples"  lettuce \n3 PART_1 fruits      NA       potatoes\n4 PART_2 vegetables "bananas" brocolli\n5 PART_2 vegetables "oranges" NA      \n6 PART_3 fruits     ""        carrots \n7 PART_3 fruits      NA       brocolli\n8 PART_3 fruits      NA       lettuce \n
Run Code Online (Sandbox Code Playgroud)\n


Maë*_*aël 5

目前无法直接使用separate_rows,否则这是tidyverse可行的方法,但您可以使用cSplitfrom splitstackshape

library(dplyr)
library(splitstackshape)
cSplit(data, c("Q3", "Q4"), sep = ", ", "long") %>% 
  filter(if_any(c("Q3", "Q4"), complete.cases))

#    names         Q2      Q3       Q4
# 1 PART_1     fruits bananas brocolli
# 2 PART_1     fruits  apples  lettuce
# 3 PART_1     fruits    <NA> potatoes
# 4 PART_2 vegetables bananas brocolli
# 5 PART_2 vegetables oranges     <NA>
# 6 PART_3     fruits    <NA>  carrots
# 7 PART_3     fruits    <NA> brocolli
# 8 PART_3     fruits    <NA>  lettuce 
Run Code Online (Sandbox Code Playgroud)