2016-08-22 47 views
0

是否有一種優雅的方法用dplyr標準化具有組特定標準的列?使用組內的第一個元素對所有行進行標準化

實施例: 我有一個數據幀:

df = data.frame(year=c(1:2, 1:2), 
       group=c("a", "a", "b", "b"), 
       val=c(100, 200, 300, 900)) 

即:

year group val 
1 1  a 100 
2 2  a 200 
3 1  b 300 
4 2  b 900 

我想通過在一年= 1給定組的值來標準化val。期望的輸出:

year group val val_norm 
1 1  a 100  1 
2 2  a 200  2 
3 1  b 300  1 
4 2  b 900  3 

例如,在第4行norm = 300(year == 1 & group ==「b」)因此val_norm = 900/300 = 3.

我可以通過只用規範提取一個輔助數據幀然後做一個左側加入原始數據框。

什麼是更優雅的方式來實現這一點,而不創建臨時數據框?

回答

3

我們可以按'組'分組,然後用val'除'年'爲1的'val'(year==1)。在這裏,我選擇了第一個觀察結果(如果每個'組'有1個重複'年份')。

library(dplyr) 
df %>% 
    group_by(group) %>% 
    mutate(val_norm = val/val[year==1][1L]) 
#  year group val val_norm 
# <int> <fctr> <dbl> <dbl> 
#1  1  a 100  1 
#2  2  a 200  2 
#3  1  b 300  1 
#4  2  b 900  3 

如果我們需要的優雅和效率,data.table可以嘗試

library(data.table) 
setDT(df)[, val_norm := val/val[year==1][1L] , by = group] 
+2

優秀。我不知道可以在mutate([year == 1])中進行子選擇。這很棒。也感謝data.table獎金。 – user673592

+0

@donlelek你在這個例子中是正確的,但如果'year'沒有被排序,它可能會失敗。 – akrun

相關問題