【问题标题】:subtracting values a in column in R based on values in another column根据另一列中的值减去 R 中列中的值 a
【发布时间】:2017-01-31 23:56:09
【问题描述】:

我的数据如下所示

#    View  date    value1 Value2 
#     a  2012-10-01 21.01  2.00
#     b  2012-10-01 22.04  3.03
#     c  2012-10-01 22.65  7.61
#     a  2012-11-01 23.11  8.46
#     b  2012-11-01 35.21  9.00
#     c  2012-11-01 35.21  9.00

structure(list(View = c("a", "b", "c", "a", "b", "c"), date = c("2012-10-01", 
"2012-10-01", "2012-10-01", "2012-11-01", "2012-11-01", "2012-11-01"
), value1 = c(21.01, 22.04, 22.65, 23.11, 35.21, 35.21), Value2 = c(2, 
3.03, 7.61, 8.46, 9, 9)), .Names = c("View", "date", "value1", 
"Value2"), row.names = c(NA, -6L), class = "data.frame")

我想创建一个新视图“D”,它是任何给定日期的“c”减去“a”。即最终得到一个看起来像这样的数据集?

#    View  date    value1 Value2 
#     a 2012-10-01 21.01  2.00
#     b 2012-10-01 22.04  3.03
#     c 2012-10-01 22.65  7.61
#     D 2012-10-01  1.61  5.61
#     a 2012-11-01 23.11  8.46
#     b 2012-11-01 35.21  9.00
#     c 2012-11-01 35.21  9.00
#     D 2012-10-01 12.1   0.54

我对 R 有所了解,但我不知道如何解决这个问题。任何建议将不胜感激。

【问题讨论】:

    标签: r group-by data.table aggregate subtraction


    【解决方案1】:

    在将 data.table 按date 分组后,您可以使用.SD(来自唯一日期的子 data.table)rbind 一个新的计算行:

    df[, rbind(.SD, 
         .(View = "D", value1 = value1[View == "c"] - value1[View == "a"], 
                       Value2 = Value2[View == "c"] - Value2[View == "a"])), date]
    
    #         date View value1 Value2
    #1: 2012-10-01    a  21.01   2.00
    #2: 2012-10-01    b  22.04   3.03
    #3: 2012-10-01    c  22.65   7.61
    #4: 2012-10-01    D   1.64   5.61
    #5: 2012-11-01    a  23.11   8.46
    #6: 2012-11-01    b  35.21   9.00
    #7: 2012-11-01    c  35.21   9.00
    #8: 2012-11-01    D  12.10   0.54
    

    为避免对列名进行硬编码,但仍假设您有 dateView 列要操作:

    # drop View column so that you can do subtraction
    df[, rbind(.SD, { dt = .SD[, !"View", with = F];      
                     # subtract row c and row a and assign a new View column as D           
                     (dt[View == "c"] - dt[View == "a"])[, View := "D"][] }), date]
    
    #         date View value1 Value2
    #1: 2012-10-01    a  21.01   2.00
    #2: 2012-10-01    b  22.04   3.03
    #3: 2012-10-01    c  22.65   7.61
    #4: 2012-10-01    D   1.64   5.61
    #5: 2012-11-01    a  23.11   8.46
    #6: 2012-11-01    b  35.21   9.00
    #7: 2012-11-01    c  35.21   9.00
    #8: 2012-11-01    D  12.10   0.54
    

    【讨论】:

    • 这太棒了!但我仍然有一个问题是我拥有的列名是动态的。有没有一种方法可以代替指定 value1 = 和 value 2 = .... 我根据索引号指定列?即 df[,1] = ....?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    相关资源
    最近更新 更多