【问题标题】:tranpose specific columns in data frame转置数据框中的特定列
【发布时间】:2013-09-05 09:50:16
【问题描述】:

我的数据集如下所示:

customerid  product store   Date    Sales
1   A   X1  1/2/2013    4
1   B   x2  1/9/2013    4
1   A   x2  1/9/2013    4
1   C   x1  1/16/2013   2
1   B   x1  1/16/2013   2
1   A   x1  1/16/2013   4
2   A   x1  1/23/2013   2
2   B   x2  1/30/2013   2
2   C   x1  2/6/2013    2
2   D   x3  2/13/2013   4

我需要按产品转置,以便所有产品显示为列..如下所示..

customerid  Date    Store   A   B   C   D
1   1/2/2013    x1  4           
1   1/9/2013    x2  4   4       
1   1/16/2013   x1  4   2   2   
2   1/23/2013   x1  2           
2   1/30/2013   x2      2       
2   2/6/2013    x1          2   
2   2/13/2013   x3              4

请帮忙!我正在尝试使用转置功能,但我尝试在这里阅读一些线程但没有成功,但无济于事

谢谢!

【问题讨论】:

    标签: r reshape transpose


    【解决方案1】:

    您可以使用“reshape2”中的dcast

    library(reshape2)
    dcast(mydf, customerid + store + Date ~ product, value.var="Sales")
    #   customerid store      Date  A  B  C  D
    # 1          1    x1 1/16/2013  4  2  2 NA
    # 2          1    X1  1/2/2013  4 NA NA NA
    # 3          1    x2  1/9/2013  4  4 NA NA
    # 4          2    x1 1/23/2013  2 NA NA NA
    # 5          2    x1  2/6/2013 NA NA  2 NA
    # 6          2    x2 1/30/2013 NA  2 NA NA
    # 7          2    x3 2/13/2013 NA NA NA  4
    

    如果您想使用 "" 而不是 NA,您也可以这样做,但请注意,您会将这些列强制转换为 character

    dcast(mydf, customerid + store + Date ~ product, value.var="Sales", fill="")
    #   customerid store      Date A B C D
    # 1          1    x1 1/16/2013 4 2 2  
    # 2          1    X1  1/2/2013 4      
    # 3          1    x2  1/9/2013 4 4    
    # 4          2    x1 1/23/2013 2      
    # 5          2    x1  2/6/2013     2  
    # 6          2    x2 1/30/2013   2    
    # 7          2    x3 2/13/2013       4
    

    对于基本 R 解决方案,您可以使用 reshape():

    reshape(mydf, direction = "wide", 
            idvar = c("customerid", "store", "Date"), 
            timevar = "product")
    #    customerid store      Date Sales.A Sales.B Sales.C Sales.D
    # 1           1    X1  1/2/2013       4      NA      NA      NA
    # 2           1    x2  1/9/2013       4       4      NA      NA
    # 4           1    x1 1/16/2013       4       2       2      NA
    # 7           2    x1 1/23/2013       2      NA      NA      NA
    # 8           2    x2 1/30/2013      NA       2      NA      NA
    # 9           2    x1  2/6/2013      NA      NA       2      NA
    # 10          2    x3 2/13/2013      NA      NA      NA       4
    

    另一种可能性是使用model.matrix(感谢@Thomas 在最近的问答中解释model.matrix 方法):

    # cbind(mydf, model.matrix(~ 0 + product, data = mydf) * mydf$Sales)
    #    customerid product store      Date Sales productA productB productC productD
    # 1           1       A    X1  1/2/2013     4        4        0        0        0
    # 2           1       B    x2  1/9/2013     4        0        4        0        0
    # 3           1       A    x2  1/9/2013     4        4        0        0        0
    # 4           1       C    x1 1/16/2013     2        0        0        2        0
    # 5           1       B    x1 1/16/2013     2        0        2        0        0
    # 6           1       A    x1 1/16/2013     4        4        0        0        0
    # 7           2       A    x1 1/23/2013     2        2        0        0        0
    # 8           2       B    x2 1/30/2013     2        0        2        0        0
    # 9           2       C    x1  2/6/2013     2        0        0        2        0
    # 10          2       D    x3 2/13/2013     4        0        0        0        4
    

    【讨论】:

    • @SimonO101,我可以,但这会将这些列强制转换为character。在我看来,这不是最好的主意。
    • 可能是,我们可以为上面的 NA 设置 is.na(df)
    • ananda- 每次运行上面的 dcast 命令时我的 R 崩溃的任何原因?我的数据集有 800 万行,这就是为什么...如果是这样,我们可以让这个解决方案有所不同吗?
    • @kaos1511,它是崩溃并发出警告还是你说它冻结了? dcast 有时会很慢,如果我理解正确的话,随着组合数量的增加会很快变慢。
    • @kaos1511,如果你想将NA设置为零,只需使用dcast(mydf, customerid + store + Date ~ product, value.var="Sales", fill=0)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多