我有一个类似于以下内容的数据框列:
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搜索是徒劳的。
如果只是单个字符串,则可以使用unlist
和strsplit
的组合来解决问题,但是我不知道如何仅将其应用于数据框的整个列在行上。
我想学习一种不使用循环的解决方案,它可以使用正则表达式或可以完成工作的任何方式。
答案 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