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
例如,我知道 usinggrepl("[1][9]",df$ColA)
将获取所需的行,然后我可以使用它为数字 19 创建一个新列,但我无法弄清楚正则表达式是什么来获取单个数字(例如,1 ) 而不抓取其他数字(例如,11 或 21)。我承认我对正则表达式不是很熟悉,而且通常不需要使用它们。但是我的几次谷歌搜索都是徒劳的。
如果它只是一个字符串,则unlist
和的组合可以解决问题strsplit
,但是我不知道如何将其应用于数据帧的整个列,而无需遍历行。
我想学习一个不使用循环的解决方案,它可以使用正则表达式或任何可以完成工作的东西。
解决方案
这是一个整洁的解决方案。该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
推荐阅读
- flutter - 如何减少 ListView.separated 项目的宽度?扑
- python - 如何在 Python 中使用标题、数据卷曲?
- java - Junit Jupiter 5(Intellij)无法识别导入 org.junit.jupiter.api.Test 类
- css - 双循环断点 + 容器宽度,如 Bootstrap
- excel - 从 Word 将表格导入 Excel 会省略第一个表格中的第一行
- http - 当我们在 TCP 数据包中有端口号时,为什么我们在 HTTP 的 HOST 标头中需要端口号?
- typescript - 如何序列化 Typescript 类型信息?
- postgresql - PostgreSQL - ORDER BY with LIMIT 未按预期使用索引
- visual-studio-code - 将文件移动到 Angular 应用程序中的新文件夹中
- sorting - 如何在谷歌表格中展平矩阵后根据时间戳对答案进行排序?