2015-05-10 4 views
2

Это, конечно, очень часто встречающаяся проблема, поэтому я ожидал много вопросов здесь относительно SO относительно этого. Тем не менее, все ответы, которые я мог найти, были очень специфичны для этого вопроса и часто встречались обходные пути (вам не обязательно это делать, foobar намного лучше в этом случае) или не data.table. Возможно, это происходит потому, что не должно быть никакой опасности с data.tableR data.table Условная сумма: более чистый способ

У меня есть data.table, который содержит годовые данные по tentgelt и te_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 
+0

Это открытие пункт Граф принадлежит в комментарии, а не вопрос ... вот где я бы это сказал. Это то, что люди называют «шум» – Frank

ответ

4

Попробуйте

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

Думаю, он сказал, что они не добавляют к 1, поэтому вам нужно разделить на '(tentgelt> te_med)/((tentgelt> te_med) + (tentgelt Jason

+0

@Jason OPs код не работает. Даже если он будет работать, он не достигнет желаемого результата, используя его, потому что '9/11! = 0.45', а Евгений сделал' 9/20 = 0.45', который является желаемым выходом. В любом случае, чтобы имитировать исходный код OP, можно было бы выполнить «заработная плата [,. (Foo = {temp <- sum (tentgelt> te_med); temp/(. N- temp)}), by = year] ' –

+0

One follow-up: В образце данных' te_med' не хватает. Если 'te_med' разрешено быть' NAN', мне нужно поставить 'na.rm = TRUE 'во все 3 суммы? – FooBar

Смежные вопросы