R中的拆分序列数据帧

时间:2017-11-13 17:59:34

标签: r dataframe

我有一个像这样的序列数据框

dput(df)
structure(list(val = structure(c(3L, 2L, 4L, 1L, 5L, 6L), .Label = c("{36415},{36415}", 
                           "{36415},{85610}", "{36415},{9904}", "{85025,36415}", "{85610},{36415}", 
                           "{8872},{36415}"), class = "factor")), .Names = "val", row.names = c(NA, 
                                                                                                -6L), class = "data.frame")

df
              val
1  {36415},{9904}
2 {36415},{85610}
3   {85025,36415}
4 {36415},{36415}
5 {85610},{36415}
6  {8872},{36415}

注意上面的第3行。第一行表示序列项1后跟不同行中的项2。第3行表示item1和2属于序列中的同一行

我想将此数据框分成这样的列

col1        col2
36415       9904
36415       85610
85025,36415 NA
36415       36415
...

注意数据框的第3行是怎样的。

有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:2)

library(tidyr)
df = separate(df, col = val, into = c("col1", "col2"), sep = "\\},\\{", fill = "right")
df[] = lapply(df, gsub, pattern = "\\{|\\}", replacement = "")
df
#          col1  col2
# 1       36415  9904
# 2       36415 85610
# 3 85025,36415  <NA>
# 4       36415 36415
# 5       85610 36415
# 6        8872 36415

答案 1 :(得分:1)

来自dplyrtidyr的解决方案。我们可以将列分开,然后删除所有{}

library(dplyr)
library(tidyr)
df2 <- df %>%
  separate(val, into = c("col1", "col2"), sep = "\\},\\{", fill = "right") %>%
  mutate_all(funs(gsub("\\{|\\}", "", .)))
df2
#          col1  col2
# 1       36415  9904
# 2       36415 85610
# 3 85025,36415  <NA>
# 4       36415 36415
# 5       85610 36415
# 6        8872 36415

答案 2 :(得分:1)

这是来自extract的{​​{1}}的单行。这使用捕获组来指定列模式:

tidyr

或来自library(tidyr) extract(df, "val", c("col1", "col2"), regex = "\\{([\\d,]+)(?:\\},\\{)?([\\d,]+)?\\}") 的{​​{1}}。这使用完全相同的正则表达式:

str_match

<强>结果:

stringr