【问题标题】:Split multiple comma-separated column into separate rows [duplicate]将多个逗号分隔的列拆分为单独的行[重复]
【发布时间】:2023-03-22 18:51:01
【问题描述】:

我有一个包含两列的数据集:

Quantity    SKU
1,1         2494008,2493953
1,1,1       2167550,1336380,2365409
3,2,1,6,1   1428608,1137956,2401393,2679310,2579183

结束状态是一个如下所示的数据集:

Quantity    SKU
1           2494008
1           2493953
1           2167550
1           1336380
1           2365409
3           1428608
2           1137956
1           2401393
6           2679310
1           2579183

如果您想拆分单个变量,如here 所示,cplit 和 strsplit 可以工作,但我需要拆分两个变量(上面的数量和 SKU)。

【问题讨论】:

  • 这有很多骗子。请检查?cSplit 来自splitstackshapeseparate_rows 来自tidyr
  • 几个小时前有一个非常相似的问题。
  • 感谢大家的反馈。在深入研究 cSplit 函数后发现了一个简单的解决方案。脚本如下所示:cSplit(product_report, c('Quantity','SKU'),',',direction = 'long')

标签: r


【解决方案1】:

separate_rows 来自tidyr

df <- read.table(text="Quantity    SKU
1,1         2494008,2493953
1,1,1       2167550,1336380,2365409
3,2,1,6,1   1428608,1137956,2401393,2679310,2579183",header=TRUE,stringsAsFactors=FALSE)

library(tidyr)
df %>% separate_rows(Quantity,SKU)

   Quantity     SKU
      <chr>   <chr>
1         1 2494008
2         1 2493953
3         1 2167550
4         1 1336380
5         1 2365409
6         3 1428608
7         2 1137956
8         1 2401393
9         6 2679310
10        1 2579183

【讨论】:

    【解决方案2】:
    dat <- read.table(text="Quantity    SKU
    1,1         2494008,2493953
    1,1,1       2167550,1336380,2365409
    3,2,1,6,1   1428608,1137956,2401393,2679310,2579183", header=TRUE, stringsAsFactors=FALSE)
    dat2<-data.frame(Quantity = unlist(strsplit(dat$Quantity, split=",")), 
                 SKU=unlist(strsplit(dat$SKU, split=",")), row.names = NULL)
    
    dat3 <- as.data.frame(do.call(cbind, lapply(dat, function(x) unlist(strsplit(x, ",")))))
    
    # Quantity     SKU
    # 1         1 2494008
    # 2         1 2493953
    # 3         1 2167550
    # 4         1 1336380
    # 5         1 2365409
    # 6         3 1428608
    # 7         2 1137956
    # 8         1 2401393
    # 9         6 2679310
    # 10        1 2579183
    

    【讨论】:

    • 更简单的 dat3 是 dat3 &lt;- data.frame(lapply(dat, function(x) unlist(strsplit(x, ","))))
    【解决方案3】:

    不出所料,data.table 解决方案与 by lmo 提出的基本 R 解决方案非常相似:

    library(data.table)
    data.table(dat)[, lapply(.SD, function(x) unlist(strsplit(x, ",")))]
    
        Quantity     SKU
     1:        1 2494008
     2:        1 2493953
     3:        1 2167550
     4:        1 1336380
     5:        1 2365409
     6:        3 1428608
     7:        2 1137956
     8:        1 2401393
     9:        6 2679310
    10:        1 2579183
    

    如果需要,可以保留行号:

    data.table(dat)[, rn := .I][, lapply(.SD, function(x) unlist(strsplit(x, ","))), rn]
    
        rn Quantity     SKU
     1:  1        1 2494008
     2:  1        1 2493953
     3:  2        1 2167550
     4:  2        1 1336380
     5:  2        1 2365409
     6:  3        3 1428608
     7:  3        2 1137956
     8:  3        1 2401393
     9:  3        6 2679310
    10:  3        1 2579183
    

    数据

    dat <- structure(list(Quantity = c("1,1", "1,1,1", "3,2,1,6,1"), SKU = c("2494008,2493953", 
    "2167550,1336380,2365409", "1428608,1137956,2401393,2679310,2579183"
    )), .Names = c("Quantity", "SKU"), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

      猜你喜欢
      • 2018-11-02
      • 2012-01-28
      • 1970-01-01
      • 2012-11-26
      相关资源
      最近更新 更多