2015-05-29 112 views
0

我有一个数据集如下:如何在新行中分隔R中的逗号分隔值?

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

这是可能的,并称为“解析”。“strsplit”在这里很有用。 – Roland

+0

如果你可以创建没有CSV值的数据框,你会让你的生活变得更容易。首先处理csv –

+2

你的数据结构不清楚,请提供你的数据的'dput' –

回答

9

你可以尝试cSplit从我的 “splitstackshape” 套餐:

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] 
+0

谢谢!我已经在使用这个软件包,但只能将值分割成新列。 –

1

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 
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