我有一个问题,这是SE上一个包含良好问题的扩展。即:
Split a column of a data frame to multiple columns
我的数据有一个字符串格式的列,以逗号分隔,但没有固定的长度。
data = data.frame(id = c(1,2,3), treatments = c("1,2,3", "2,3", "8,9,1,2,4"))
所以我想让我的数据框最终处于适当的整齐/长形式:
id treatments
1 1
1 2
1 3
...
3 1
3 2
3 4
像separate
或strsplit
这样的东西似乎并没有成为解决方案。单独失败并显示警告:各列的值太多(NB id 3的值大于id 1)。
由于
答案 0 :(得分:2)
您可以使用tidyr::separate_rows
:
library(tidyr)
separate_rows(data, treatments)
# id treatments
#1 1 1
#2 1 2
#3 1 3
#4 2 2
#5 2 3
#6 3 8
#7 3 9
#8 3 1
#9 3 2
#10 3 4
答案 1 :(得分:0)
使用dplyr
和tidyr
个包:
data %>%
separate(treatments, paste0("v", 1:5)) %>%
gather(var, treatments, -id) %>%
na.exclude %>%
select(id, treatments) %>%
arrange(id)
id treatments
1 1 1
2 1 2
3 1 3
4 2 2
5 2 3
6 3 8
7 3 9
8 3 1
9 3 2
10 3 4
答案 2 :(得分:0)
您还可以使用unnest
:
library(tidyverse)
data %>%
mutate(treatments = stringr::str_split(treatments, ",")) %>%
unnest()
id treatments
1 1 1
2 1 2
3 1 3
4 2 2
5 2 3
6 3 8
7 3 9
8 3 1
9 3 2
10 3 4