【问题标题】:How to separate comma separated values in R in a new row?如何在新行中分隔 R 中的逗号分隔值?
【发布时间】:2015-05-29 09:21:28
【问题描述】:

我有一个数据集如下:

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 中可以这样做吗?如果是,怎么做?

【问题讨论】:

  • 这是可能的,称为“解析”。 strsplit 在这里很有用。
  • 如果您可以在没有 CSV 值的情况下创建数据框,您的生活将会变得更加轻松。拥有1, 2, 3 是非关系型的,因此变得复杂。先处理 csv。
  • 您的数据结构不清楚,请提供dput的数据。

标签: r


【解决方案1】:

你可以试试我的“splitstackshape”包中的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

当然,我非常偏爱cSplit,但你也可以使用“tidyr”中的“dplyr”和unnest

library(dplyr)
library(tidyr)

mydf %>%
  mutate(col2 = strsplit(gsub("[][\"]", "", col2), ",")) %>%
  unnest(col2)

或者只是使用“data.table”:

library(data.table)
as.data.table(mydf)[, list(
  col2 = unlist(strsplit(gsub("[][\"]", "", col2), ","))), 
  by = col1]

【讨论】:

  • 谢谢!我已经在使用这个包,但只能将值拆分到新列中。
  • 你为什么用gsub("[][\"]", "", col2)而不是as.character(col2)
【解决方案2】:

tidyr 中的 separate_rows() 函数是具有多个分隔值的观察的老板。由于您混合了整数和字符串(但只想在最终结果中使用整数,请设置 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
d %>%
  separate_rows(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

【讨论】:

  • 感谢分享这个解决方案。
猜你喜欢
  • 2018-07-18
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2017-07-04
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多