我有一个数据集如下:
col1 col2
a 1,2,3
b ["1","2"]
c 4
我希望输出为:
col1 col2
a 1
a 2
a 3
b 1
b 2
c 4
是否可以在R中这样做?如果是,怎么样?
答案 0 :(得分:11)
您可以从我的“splitstackshape”软件包中尝试{
"countries": [
{...}
],
"states" [
{...}
],
"cities": [
{...}
]
}
:
cSplit
当然,我非常偏向library(splitstackshape)
cSplit(as.data.table(mydf)[, col2 := gsub("[][\"]", "", col2)],
"col2", ",", "long")
# col1 col2
# 1: a 1
# 2: a 2
# 3: a 3
# 4: b 1
# 5: b 2
# 6: c 4
,但您也可以使用“tidyr”中的“dplyr”和cSplit
:
unnest
或者只是使用“data.table”:
library(dplyr)
library(tidyr)
mydf %>%
mutate(col2 = strsplit(gsub("[][\"]", "", col2), ",")) %>%
unnest(col2)
答案 1 :(得分:1)
separate_rows()
中的tidyr
函数是具有多个分隔值的观察的老大。由于您混合了整数和字符串(但只想在最终结果中使用整数,请设置convert = TRUE
并使用drop_na()
(也在tidyr
中)过滤掉新行否则,方括号将会去。
# create data
library(tidyverse)
d <- data_frame(
col1 = c("a", "b", "c"),
col2 = c("1,2,3", "[\"1\",\"2\"]", 4)
)
d
# # A tibble: 3 x 2
# col1 col2
# <chr> <chr>
# 1 a 1,2,3
# 2 b "[\"1\",\"2\"]"
# 3 c 4
# tidy data
separate_rows(d, col2, convert = TRUE) %>%
drop_na()
# # A tibble: 6 x 2
# col1 col2
# <chr> <int>
# 1 a 1
# 2 a 2
# 3 a 3
# 4 b 1
# 5 b 2
# 6 c 4