【问题标题】:Calculating for each row in a dataframe计算数据框中的每一行
【发布时间】:2017-03-09 21:45:06
【问题描述】:

给定一个数据框

  ID days dose1 dose2 dose3 dose4  pattern
1 TM    2  11.0    45   0.2   0.1    spots
2 ZZ   18   2.0     6   8.0   0.0 no spots
3 YY    5   0.4     8  10.0  20.0 no spots
4 GG    5   0.4     8  10.0  20.0    spots


df <- structure(list(ID = c("TM", "ZZ", "YY", "GG"), days = c(2L, 18L, 
5L, 5L), dose1 = c(11, 2, 0.4, 0.4), dose2 = c(45L, 6L, 8L, 8L
), dose3 = c(0.2, 8, 10, 10), dose4 = c(0.1, 0, 20, 20), pattern = c("spots", 
"no spots", "no spots", "spots")), .Names = c("ID", "days", "dose1", 
"dose2", "dose3", "dose4", "pattern"), row.names = c(NA, -4L), class = "data.frame")

library(data.table)
setDT(df)

我想计算如下给出的每一行并将其总结为图案“斑点”和“无斑点” -

dfx <- df[, list(
  Cal1 = sum(dose1>0)/days, 
  Cal2 = sum(dose2>0)/days, 
  Cal3 = sum(dose3>0)/days, 
  Cal4 = sum(dose4>0)/days
), by=pattern]

我是否可以按上述方式计算每一行并将其添加到数据框 dfx 中?

【问题讨论】:

  • 您要计算的内容并不完全清楚:预期输出的指示会有所帮助。

标签: r data.table


【解决方案1】:

无需将计算保存到单独的data.frame

df[, paste0("Cal", 1:4) := .(sum(dose1>0)/days, 
                             sum(dose2>0)/days, 
                             sum(dose3>0)/days, 
                             sum(dose4>0)/days), by = pattern]
df
#   ID days dose1 dose2 dose3 dose4  pattern      Cal1      Cal2      Cal3       Cal4
#1: TM    2  11.0    45   0.2   0.1    spots 1.0000000 1.0000000 1.0000000 1.00000000
#2: ZZ   18   2.0     6   8.0   0.0 no spots 0.1111111 0.1111111 0.1111111 0.05555556
#3: YY    5   0.4     8  10.0  20.0 no spots 0.4000000 0.4000000 0.4000000 0.20000000
#4: GG    5   0.4     8  10.0  20.0    spots 0.4000000 0.4000000 0.4000000 0.40000000

【讨论】:

    【解决方案2】:

    如果您有许多 dose1dose2 等列,则为每个输出列 Cal1Cal2 等编写单独的表达式会变得很麻烦。相反,data.table 语法允许写得简明扼要

    df[, paste0("Cal", 1:4) := lapply(.SD, function(x) sum(x > 0) / days), 
       by = pattern, .SDcols = paste0("dose", 1:4)]
    df
    #   ID days dose1 dose2 dose3 dose4  pattern      Cal1      Cal2      Cal3       Cal4
    #1: TM    2  11.0    45   0.2   0.1    spots 1.0000000 1.0000000 1.0000000 1.00000000
    #2: ZZ   18   2.0     6   8.0   0.0 no spots 0.1111111 0.1111111 0.1111111 0.05555556
    #3: YY    5   0.4     8  10.0  20.0 no spots 0.4000000 0.4000000 0.4000000 0.20000000
    #4: GG    5   0.4     8  10.0  20.0    spots 0.4000000 0.4000000 0.4000000 0.40000000
    

    【讨论】:

    • 很好,dplyr 具有类似的速记语法糖,尽管这使表达更简单 imo。
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2019-09-18
    • 2022-11-10
    • 2018-01-03
    • 2020-02-12
    • 1970-01-01
    • 2015-10-07
    • 2016-10-14
    相关资源
    最近更新 更多