【问题标题】:R adding a column based on the value of another columnR根据另一列的值添加一列
【发布时间】:2015-08-04 18:36:36
【问题描述】:

我正在尝试转换具有此类数据的 data.frame

COMPANY COUNTRY CURRENCY IND1     WGT1 IND2   WGT2 IND3     WGT3
COMP1   USA     USD      HEALTH   .58  RETAIL .42  <NA>     0
COMP2   USA     USD      AUTO     .78  RETAIL .12  TRANSPRT .1
COMP3   CAN     CAD      SOFTWARE 1    <NA>   0    <NA>     0

我想把它变成

COMPANY COUNTRY CURRENCY HEALTH AUTO SOFTWARE RETAIL TRANSPRT
COMP1   USA     USD      .58    0    0        .42    0
COMP2   USA     USD      0      .78  0        .12    .1
COMP3   CAN     CAD      0      0    1        0      0

解决此问题的最佳方法是什么? 提前致谢 是

【问题讨论】:

    标签: r add reshape


    【解决方案1】:

    我们可以使用devel 版本的data.table 中的melt/dcast,即v1.9.5

    将“data.frame”转换为“data.table”(setDT(df1))。 melt 来自 data.table 可以采用多个 measure 列。我们指定以前缀“IND”、“WGT”开头的列名为patterns,并将“宽”格式转换为“长”格式。通过将 'variable' 列分配给 NULL 来删除它,然后将 dcast 从 'long' 指定为 'wide' 并将 'value.var' 指定为 'value2'。

    library(data.table)#v1.9.5+
    DT <- melt(setDT(df1), measure=patterns('^IND', 'WGT'),
                                na.rm=TRUE)[, variable:=NULL]
    dcast(DT, ...~value1, value.var='value2', fill=0)
    #   COMPANY COUNTRY CURRENCY AUTO HEALTH RETAIL SOFTWARE TRANSPRT
    #1:   COMP1     USA      USD 0.00   0.58   0.42        0      0.0
    #2:   COMP2     USA      USD 0.78   0.00   0.12        0      0.1
    #3:   COMP3     CAN      CAD 0.00   0.00   0.00        1      0.0
    

    数据

    df1 <- structure(list(COMPANY = c("COMP1", "COMP2", "COMP3"), 
    COUNTRY = c("USA", 
    "USA", "CAN"), CURRENCY = c("USD", "USD", "CAD"), IND1 = c("HEALTH", 
    "AUTO", "SOFTWARE"), WGT1 = c(0.58, 0.78, 1), IND2 = c("RETAIL", 
    "RETAIL", NA), WGT2 = c(0.42, 0.12, 0), IND3 = c(NA, "TRANSPRT", 
    NA), WGT3 = c(0, 0.1, 0)), .Names = c("COMPANY", "COUNTRY", "CURRENCY", 
    "IND1", "WGT1", "IND2", "WGT2", "IND3", "WGT3"), row.names = c(NA, 
    -3L), class = "data.frame")
    

    【讨论】:

    • 这可行,但我不能在我们的生产中真正使用 data.table 的开发版本。我将使用 Webb 给出的 reshape 选项和 dcast 而不是 xtabs。
    【解决方案2】:

    这是使用 reshapextabs 的默认库解决方案

    long<-reshape(df,sep="",varying=4:9,direction="long")
    cbind(df[,1:3],as.data.frame.matrix(xtabs(WGT~COMPANY+IND,long)))
    
    公司 国家 货币 汽车 健康 软件 零售 运输 COMP1 COMP1 美国 USD 0.00 0.58 0 0.42 0.0 COMP2 COMP2 美国 USD 0.78 0.00 0 0.12 0.1 COMP3 COMP3 CAN CAD 0.00 0.00 1 0.00 0.0

    【讨论】:

    • 我使用 dcast 而不是 xtabs 并得到了这个工作。这就是我所做的。 library(reshape2) df.long
    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2022-12-15
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多