2015-05-29 158 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