将包含一串逗号分隔值的数据框列拆分为多个列

时间:2019-06-21 21:57:33

标签: r

我有一个类似于以下内容的数据框列:

ColA
""
"1"
"1,9"
"9,19"
"1,9,19"

数据框中有数百行,数字1-30可以出现在逗号分隔的列表中。我想将这些值分成自己的列,并用布尔值指示数字是否存在。

colA_1  colA_9  colA_19

1       0       0                    
1       1       0
0       1       1
1       1       1

例如,我知道使用grepl("[1][9]",df$ColA)可以获取所需的行,然后可以使用它为数字19创建新列,但是我无法弄清楚要获取的正则表达式是什么一位数字(例如1)而没有抓住其他数字(例如11或21)。我承认我对正则表达式不是很熟悉,并且通常不需要使用它们。但是我很少有Google搜索是徒劳的。

如果只是单个字符串,则可以使用unliststrsplit的组合来解决问题,但是我不知道如何仅将其应用于数据框的整个列在行上。

我想学习一种不使用循环的解决方案,它可以使用正则表达式或可以完成工作的任何方式。

1 个答案:

答案 0 :(得分:1)

这是一个整洁的解决方案。 seperate呼叫会向您发出警告,但可以正常工作:

library(tidyverse)
df <- tibble(ColA = c("", "1", "1,9", "9,19", "1,9,19"))

df1 <- df %>% 
  mutate(n = row_number()) %>% 
  separate(ColA, into = str_c("ColA", 1:30)) %>% 
  gather(key, value, -n) %>% 
  filter(!is.na(value), value != "") %>% 
  mutate(
    key = str_c(str_sub(key, 1, 4), value),
    value2 = 1
  ) %>%
  select(-value) %>% 
  spread(key, value2)

## replace missings
df1[is.na(df1)] <- 0