【问题标题】:R data.table Conditional Sum: Cleaner wayR data.table 条件总和:更清洁的方式
【发布时间】:2015-05-10 13:06:19
【问题描述】:

这当然是一个经常遇到的问题,所以我在这里期待很多关于这个的问题。但是,我能找到的所有答案都非常针对问题,并且经常遇到解决方法(您不必这样做,foobar 在这种情况下要好得多)或非 data.table 解决方案.也许这是因为它应该是 data.table 的明智之举

我有一个 data.table,其中包含 tentgeltte_med 的年度数据。对于每一年,我想知道tentgelt > te_med 的观察份额。这就是我正在做的:

# note that nAbove and nBelow do not add up to 1
nAbove <- wages[tentgelt > te_med, list(nAbove = .N), by=list(year)]
nBelow <- wages[tentgelt < te_med, list(nBelow = .N), by=list(year)]
nBelow[nAbove][, list(year, foo=nAbove/(nAbove+nBelow))]

这可行,但每当我看到其他人的 data.table 代码时,它看起来比我的解决方法更清晰、更容易。有没有更简洁的方法来获得以下类型的输出?

   year       foo
 1: 1993 0.2372093
 2: 1994 0.1567568
 3: 1995 0.8132530
 4: 1996 0.1235955
 5: 1997 0.1065574
 6: 1998 0.3070684
 7: 1999 0.1491974

这是我的数据示例:

   year tentgelt    te_med
 1: 2010   120.95  53.64929
 2: 2010     9.99 116.72601
 3: 2010   113.52  53.07394
 4: 2010    10.27  38.45728
 5: 2010    48.58 124.65753
 6: 2010    96.38  86.99060
 7: 2010     3.46  65.75342
 8: 2010   107.52  91.87592
 9: 2010   107.52  42.92953
10: 2010     3.46  73.92328
11: 2010    96.38  85.23419
12: 2010     2.25  79.19995
13: 2010    42.32  35.75757
14: 2010     7.94  93.44305
15: 2010   120.95 113.41370
16: 2010     7.94 110.68628
17: 2010   107.52 127.30682
18: 2010     2.25 103.49036
19: 2010   120.95 123.62054
20: 2010    96.38  68.57532

对于此示例,预期输出应为:

   year   V2
1: 2010 0.45

【问题讨论】:

  • 开头段落属于评论,而不是问题......无论如何,这就是我要放的地方。这就是Meta Stack Overflow 上的人们所说的“噪音”

标签: r data.table


【解决方案1】:

试试这个

wages[, list(foo= sum(tentgelt > te_med)/.N), by = year]
#    year  foo
# 1: 2010 0.45

【讨论】:

  • 我想他说这两个不加为1,所以你需要除以(tentgelt&gt;te_med)/((tentgelt&gt;te_med)+(tentgelt&lt;te_med)而不是.N
  • @Jason OPs 代码不起作用。即使它可以工作,他们也不会使用它达到所需的输出,因为9/11 != 0.45,而 Yevgeny 做了9/20 = 0.45,这是所需的输出。无论哪种方式,为了模仿 OP 的原始代码,都可以这样做 wages[, .(foo = {temp &lt;- sum(tentgelt &gt; te_med) ; temp/(.N-temp)}), by= year]
  • 一个后续:在样本数据中te_med没有丢失。如果允许te_medNAN,我是否必须将na.rm=TRUE 放入所有三个总和中?
  • 您的选项是正确的,但如果您希望 .N 答案起作用,您需要将 !is.na(te_med) 作为条件添加到 data.table
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2020-05-10
  • 2012-04-23
相关资源
最近更新 更多