计算数据框中高于阈值的行数作为函数或其他列因子

Posted

技术标签:

【中文标题】计算数据框中高于阈值的行数作为函数或其他列因子【英文标题】:calculate number of rows in a dataframe above threshold as a function or other column factors 【发布时间】:2017-03-25 12:38:04 【问题描述】:

我想在值大于 11 的每一天找到每个主题的行数,并将其输出到数据框中进行分析。数据集很大(5000 行),因此需要一个函数。

subject = c(rep("A", 12), rep("B", 12))        
day = c(1,1,1,1,2,2,2,2,3,3,3,3,1,1,1,1,2,2,2,2,3,3,3,3)
value = c(13,14,15,5,12,9,6,14,4,2,1,2,13,14,15,5,12,9,6,14,2,2,2,3)
df = data.frame(subject, day, value)
df

   subject day value
1        A   1    13
2        A   1    14
3        A   1    15
4        A   1     5
5        A   2    12
6        A   2     9
7        A   2     6
8        A   2    14
9        A   3     4
10       A   3     2
11       A   3     1
12       A   3     2
13       B   1    13
14       B   1    14
15       B   1    15
16       B   1     5
17       B   2    12
18       B   2     9
19       B   2     6
20       B   2    14
21       B   3     2
22       B   3     2
23       B   3     2
24       B   3     3

我想要的输出是

subject.agg = c(rep("A", 3), rep("B", 3)) 
day.agg = as.factor(c(1,2,3,1,2,3))
highvalues = (c(3,2,0,3,2,0))
df.agg = data.frame(subject.agg,day.agg,highvalues)
df.agg

  subject.agg day.agg highvalues
1           A       1          3
2           A       2          2
3           A       3          0
4           B       1          3
5           B       2          2
6           B       3          0

非常感谢任何帮助。

【问题讨论】:

非常感谢两位。 DT 解决方案非常适合我。 【参考方案1】:

一个选项是aggregate 来自base R

aggregate(cbind(highvalues=value>11)~., df,  sum)

或者data.table

library(data.table)
setDT(df)[value>11, .(highvalues=.N), by = .(subject, day)]
#     subject day highvalues
#1:       A   1          3
#2:       A   2          2
#3:       A   3          3
#4:       B   1          3
#5:       B   2          2
#6:       B   3          3

【讨论】:

这太好了,非常感谢。无论如何,我是否可以在输出主题日中包含没有高于 11 的值。即,对于主题 A 有第四天没有高于 11 的值,它会显示为 A 4 0?谢谢!! @MLyall 您能否更新您的帖子,了解您对所需输出的期望 @MLyall 您可以使用join 使用“主题”、“日期”的所有独特组合,也可以使用if/else 谢谢,我已将问题更新为更具体 @MLyall 也许setDT(df)[value>11, .(highvalues=.N), by = .(subject, day)][CJ(subject = df$subject, day = df$day, unique=TRUE), on = c('subject', 'day')][is.na(highvalues), highvalues := 0][] 【参考方案2】:

你可以走tidyverse的方式:

df %>%
  filter(value > 11) %>%
  group_by(subject,day) %>%
  mutate(highvalue = n()) %>%
  select(subject, day, highvalue) %>%
  unique()

【讨论】:

【参考方案3】:
library(data.table)
dt = setDT(df)
dt[, sum(value>11),by = .(subject,day)]
   subject day V1
1:       A   1  3
2:       A   2  2
3:       A   3  3
4:       B   1  3
5:       B   2  2
6:       B   3  3

【讨论】:

以上是关于计算数据框中高于阈值的行数作为函数或其他列因子的主要内容,如果未能解决你的问题,请参考以下文章

y_pred 的自定义损失函数 Keras 仅高于某个阈值

R语言使用car包的vif函数计算方差膨胀因子,并基于方差膨胀因子开方后和阈值的判断来确认模型特征(预测变量)之间是否存在多重共线性(Multicollinearity)

从数据框中手动创建 ROC 曲线

使用 promql 获取结果总数或高于阈值的百分比

如何从JTextArea中删除旧文本,以便文档大小不超过阈值? (JAVA)

7.04 求一个表的行数