首页 > 解决方案 > 将包含一串逗号分隔值的数据框列拆分为多列

问题描述

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

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

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

如果它只是一个字符串,则unlist和的组合可以解决问题strsplit,但是我不知道如何将其应用于数据帧的整个列,而无需遍历行。

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

标签: r

解决方案


这是一个整洁的解决方案。该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

推荐阅读