【问题标题】:Reshape data from rows to column in dataframe in R [duplicate]在R中的数据框中将数据从行重塑为列[重复]
【发布时间】:2016-12-11 22:18:39
【问题描述】:

我想重塑数据框中以下形式的数据:

a  b  Type_c d  e  
1  1   0     10 9
2  1   0     20 9 
3  2   1     30 4
4  2   2     40 3
5  3   3     50 2
6  3   0     60 1
7  4   3     70 2
8  4   2     80 7 
9  4   2     90 8

并希望通过整形或转换获得以下格式的数据。

a  b  Type_0_d Type_0_e Type_1_d Type_1_e type_2_d type_2_e type_3_d  type_3_e  
1  1  10       9          0        0         0      0         0          0
2  1  20       9          0        0         0      0         0          0
3  2  0        0          30       4         0      0         0          0
4  2  0        0          0        0        40      3         0          0
5  3  0        0          0        0         0      0        50          2
6  3  60       1          0        0         0      0         0          0
7  4  0        0          0        0         0      0        70          2
8  4  0        0          0        0        80      7         0          0
9  4  0        0          0        0        90      8         0          0

我发现在 R 中做同样的事情并不困难。但是,在 Tableau 中,这很简单。只是想知道是否有办法在 R 中有效地做同样的事情。

【问题讨论】:

    标签: r transform reshape2


    【解决方案1】:

    另一个选项可能使用spreadtidyr

    library(dplyr)
    library(tidyr)
    df1 %>% mutate(e1=Type_c) %>% spread(key = Type_c,value = d,fill = 0) %>% spread(key =e1,value = e,fill = 0)
    

    我知道这是一个糟糕的解决方案,但它仍然在发挥作用。欢迎任何有关修改代码的建议。还有一件事我们必须正确地重命名列。

    【讨论】:

    • 我会使用gather/spread gather(df1, Var, Val, d:e) %>% unite(Varc, Var, Type_c) %>% spread(Varc, Val, fill = 0)
    【解决方案2】:

    我们可以使用来自data.tabledcast,它可以占用多个value.var

    library(data.table)
    dcast(setDT(df1), a+b ~paste0("Type_", Type_c), value.var = c("d", "e"), fill = 0)
    

    【讨论】:

    • 太可爱了。我一直在尝试使用来自reshapedcast,但我还差得很远:/
    • @akrun :谢谢,这是一个很好的工作方法。更简单、更快捷。
    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 2015-09-30
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多