R-按图例从另一列拆分

时间:2019-02-26 14:00:14

标签: r

我有如下所示的data.frame

ID  age legend                 location     
1   83  country;province;city  X;A;J
2   15  country;city           X;K
3   2   country;province;city  Y;B;I
4   12  country;city           X;L
5   2   country;city           Y;J
6   2   country;province;city  Y;A;M
7   18  country;province;city  X;B;J
8   85  country;province;city  X;A;I

要描述它:第三列(图例)带有对第四列(位置)值的描述。图例列的行中记录的顺序指示位置列中的值的顺序。

因此,我需要获得如下的data.frame

ID age country province city
1  83      X        A    J
2  15      X     <NA>    K
3  2       Y        B    I
4  12      X     <NA>    L
5  2       Y     <NA>    J
6  2       Y        A    M
7  18      X        B    J
8  85      X        A    I

为进行描述,我需要从图例列中提取信息,并将其设置为新列的名称,然后从位置列中填充适当的信息。我不能只将列分开;因为每行中记录的数量不同。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

使用最后在“注释”中可重复显示的DF,先使用separate_rows,然后spread将数据从长到宽传输。如果列的顺序无关紧要,则可以省略select行。

library(dplyr)
library(tidyr)

DF %>% 
  separate_rows(legend, location) %>% 
  spread(legend, location) %>%
  select(ID, age, country, province, city) # optional

给予:

  ID age country province city
1  1  83       X        A    J
2  2  15       X     <NA>    K
3  3   2       Y        B    I
4  4  12       X     <NA>    L
5  5   2       Y     <NA>    J
6  6   2       Y        A    M
7  7  18       X        B    J
8  8  85       X        A    I

注意

Lines <- "
ID  age legend                 location     
1   83  country;province;city  X;A;J
2   15  country;city           X;K
3   2   country;province;city  Y;B;I
4   12  country;city           X;L
5   2   country;city           Y;J
6   2   country;province;city  Y;A;M
7   18  country;province;city  X;B;J
8   85  country;province;city  X;A;I"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)