【问题标题】:Creating a new variable which takes different columns from an existing on data frame, dependent on a grouping variable创建一个新变量,该变量从现有数据框中获取不同的列,具体取决于分组变量
【发布时间】:2013-02-07 05:34:37
【问题描述】:

我不知道从哪里开始这段代码。我想将一个新变量附加到现有数据框中,该数据框根据分组变量采用不同的列。例如,假设我有列

    A  B  C  D  E  F
    1  2  3  6  11 12
    1  7  5  10 8  9
    2  19 2  4  5  6
    2  8  4  3  1  1

我想附加一个新列“G”,如果 A 为 1,则为 B 列,如果 A 为 2,则为 D 列

    A  B  C  D  E  F   G
    1  2  3  6  11 12  2 
    1  7  5  10 8  9   7
    2  19 2  4  5  6   4
    2  8  4  3  1  1   3

谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    这里有几个选项。

    假设您的 data.frame 被称为 DF

    基本[ 和索引

    # make everything in G =  B
    DF$G <- DF$B
    # replace those cases where A==2 with D
    DF$G[DF$A==2] <- DF$D[DT$A==2]
    

    使用 ifelse

    只需要一个ifelse 语句,因为 A 是 1 或 2

    DF$G <- ifelse(DF$A==2, DF$D, DF$B)
    

    使用数据表

    我喜欢 data.table,因为内存效率和编码优雅

    library(data.table)
    # create a data.table with A as the key
    
    DT <- data.table(DF, key = 'A')
    # where the key (A) == 1 ], then assign G = B
    DT[.(1), G := B]
    # and where the key (A) == 2, then assign G = D
    DT[.(2), G := D]
    

    美丽优雅!

    【讨论】:

    • 不错的 data.table 方法。 +1
    • 其次,喜欢data.table。 +1 现在想知道。您将如何修改 DT 答案以从 不同 data.table 中的一列或另一列分配值? IE。我有一个外部 data.table B,其值要加入原始 data.table A,我需要根据数据中一列的值从外部 data.table B 中分配一个或其他列。表A?
    【解决方案2】:

    假设你的data.frame被称为“mydf”,你可以使用ifelse

    within(mydf, {
      G <- ifelse(A == 1, B,
                  ifelse(A == 2, D, 
                         0))
    })
    #   A  B C  D  E  F G
    # 1 1  2 3  6 11 12 2
    # 2 1  7 5 10  8  9 7
    # 3 2 19 2  4  5  6 4
    # 4 2  8 4  3  1  1 3
    

    【讨论】:

    • 或者,类似地,transform(mydf, G=ifelse(A==1, B, ifelse(A==2, D, NA)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多