Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于r中的一列拆分数据帧,列的宽度不固定_R_Dataframe_Reshape_Tidyr - Fatal编程技术网

基于r中的一列拆分数据帧,列的宽度不固定

基于r中的一列拆分数据帧,列的宽度不固定,r,dataframe,reshape,tidyr,R,Dataframe,Reshape,Tidyr,我有一个问题,它是SE上一个覆盖范围很广的问题的扩展。即: 我的数据有一个字符串格式的列,逗号分隔,但没有固定长度 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或strs

我有一个问题,它是SE上一个覆盖范围很广的问题的扩展。即:

我的数据有一个字符串格式的列,逗号分隔,但没有固定长度

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)


感谢使用
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

使用
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

您还可以使用
unest

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

您还可以使用
unest

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

您可以使用
tidyr::分隔行

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

您可以使用
tidyr::分隔行

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

好极了谢谢@PsidomMagnitive!谢谢@Psidom