如何计算数组的子集组中的项数大于该数组中的特定值?

Mar*_*ijn 2 r count subset data.table

我想计算一个数组的子集组中的项数大于R中该数组中的特定值.参见下面的示例,每年都有一个外部基准,它是给定数据的一部分(这个不是数据集的平均值).对于给出一年基准的每一行,我想添加一列,其中重量大于基准的男性数量; 并且一列的女性数量大于基准.

> MyData
   year      type weight DesiredOutput1 DesiredOutput2
1  1990    Female     78             NA             NA
2  1990      Male     74             NA             NA
3  1990    Female     80             NA             NA
4  1990      Male     90             NA             NA
5  1990      Male     94             NA             NA
6  1990      Male     70             NA             NA
7  1990    Female     65             NA             NA
8  1990    Female     61             NA             NA
9  1990 benchmark     78              4              1
10 1990    Female     71             NA             NA
11 1990      Male     91             NA             NA
12 1990    Female     70             NA             NA
13 1990      Male     81             NA             NA
14 1991      Male     71             NA             NA
15 1991 benchmark     79              1              2
16 1991    Female     80             NA             NA
17 1991    Female     81             NA             NA
18 1991      Male     70             NA             NA
19 1991      Male     80             NA             NA
20 1991    Female     65             NA             NA
21 1992    Female     79             NA             NA
22 1992 benchmark     80              3              1
23 1992      Male     81             NA             NA
24 1992      Male     82             NA             NA
25 1992      Male     86             NA             NA
26 1992      Male     80             NA             NA
27 1992    Female     81             NA             NA
Run Code Online (Sandbox Code Playgroud)

我可以使用以下代码添加给定年份中男性/女性人数的计数:

setDT(MyData)[, Count:=.N, by='year,type']
Run Code Online (Sandbox Code Playgroud)

但我不知道如何包括这样一个事实,即我只想计算重量大于给定年份基准的男性/女性人数.有没有办法使用这个基准值的参考?当您想要计算大于固定数字(例如大于70)的值的数量时,我已经看到了几种解决方案,但是如何与数组中的值进行比较?

Dav*_*urg 8

我认为你不需要所有这些NA.如果你只需要计数,你可以简单地按条件表,这是一个例子

setDT(MyData)[, as.list(table(factor(type[weight > weight[type == 'benchmark']]))), 
                by = year]
#    year Female Male
# 1: 1990      1    4
# 2: 1991      2    1
# 3: 1992      1    3
Run Code Online (Sandbox Code Playgroud)

另一个选项(可能更快一点)是按条件选择事件然后 dcast

dcast(setDT(MyData)[, type[weight > weight[type == 'benchmark']], by = year], 
                      year ~ V1, length)
#    year Female Male
# 1: 1990      1    4
# 2: 1991      2    1
# 3: 1992      1    3
Run Code Online (Sandbox Code Playgroud)

或者类似的

setDT(MyData)[, type[weight > weight[type == 'benchmark']], by = year
               ][, table(year, factor(V1))]
# year   Female Male
# 1990        1    4
# 1991        2    1
# 1992        1    3
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,如果你坚持将结果恢复到你的原始数据集,一个快速的方法是加入(但这不会产生NAs),类似(使用v 1.9.6+)

res <- dcast(setDT(MyData)[, type[weight > weight[type == 'benchmark']], by = year],
                             year ~ V1, length)
MyData[res, c("Female", "Male") := .(i.Female, i.Male), on = "year"]
Run Code Online (Sandbox Code Playgroud)