【问题标题】:Calculating proportion of values using condition and grouping by ID in R在R中使用条件和按ID分组计算值的比例
【发布时间】:2021-09-29 18:54:37
【问题描述】:

我有一个数据表:

DT <- data.table(ID = c(1,1,1,1,2,2,2,3,3), score=c(78, 93, 88, 50, 101, 95, 89, 90))

# DT output
ID, score
1, 78
1, 93
1, 88
1, 50
2, 100
2, 95
2, 71
3, 90
3, 75

我想获取每个ID得分高于和低于80的比例。例如:

ID, above_80, below_80
1, 0.5, 0.5
2, 0.67, 0.33
3, 0.5, 0.5

我尝试使用以下方法:

proportion_DT <- DT[,list(above_80 = sum(score >= 80)/sum(score < 80),
                          below_80 = sum(score < 80)/sum(score >= 80)), by=ID]

但这并没有生成正确的表格。使用data.table可以做到这一点吗?

【问题讨论】:

  • 你必须除以每个ID的行数,而不是相反的比例。否则值不正确

标签: r list sum data.table grouping


【解决方案1】:

可以用mean的逻辑值计算比例。试试 -

library(data.table)

DT[, .(above_80 = mean(score >= 80),below_80 = mean(score < 80)), ID]

#   ID above_80 below_80
#1:  1    0.500    0.500
#2:  2    0.667    0.333
#3:  3    0.500    0.500

当我们对其进行数学计算时,逻辑值(TRUEFALSE)分别被视为 1 和 0。

这几个例子将有助于澄清 -

mean(c(TRUE, FALSE, TRUE, FALSE))
#[1] 0.5

mean(c(TRUE, TRUE, TRUE, FALSE))
#[1] 0.75

mean(c(TRUE, TRUE, TRUE, TRUE))
#[1] 1

score &gt;= 80 类似地返回逻辑值,并将mean 放在它们之上为我们提供了它们的比例。

数据

DT <- data.table(ID = c(1,1,1,1,2,2,2,3,3), 
                 score=c(78, 93, 88, 50, 100, 95, 71, 90, 75))

【讨论】:

  • 感谢您的帮助!计算比例时是否可以忽略score 列中的NA 值?比如mean(score &gt;= 80, na.rm = FALSE)
  • 若要忽略 NA 值,请使用 na.rm = TRUE
  • 你能解释一下为什么mean() 在这里工作吗?我的理解是 mean(score >= 80) 将简单地计算所有高于 80 的分数的平均值?
  • score &gt;= 80 只会给出 TRUEFALSE 值。要获得高于 80 的所有分数的平均值,您需要mean(score[score &gt;= 80])。也许更新的答案将帮助您了解它在这里的工作原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 2021-11-04
  • 1970-01-01
  • 2019-11-21
相关资源
最近更新 更多