我有一个像这样的序列数据框
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行是怎样的。
有没有办法实现这个目标?
答案 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)
来自dplyr
和tidyr
的解决方案。我们可以将列分开,然后删除所有{
或}
。
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