2017-02-17 15 views
1

と列の比較:私は、次のようなデータテーブルを持っている中央

TDT <- data.table(Group = c(rep("A",40),rep("B",60)), 
         Id = c(rep(1,20),rep(2,20),rep(3,20),rep(4,20),rep(5,20)), 
         Date = rep(seq(as.Date("2010-01-03"), length=20, by="1 month") - 1,5), 
         x1 = sample(100,100)) 

次のように私はx1の中央値を計算します。

TDT2 <- TDT[, median(x1), by = .(Group,Date)] 

私の質問は:どのように私は、それぞれの値を比較することができますTDTのx1と、結果として得られるグループごとの中央値と日付?例えば、それがより低い場合、TRUEになるはずです。 GroupとDateにネストされたforループのある方法が分かっていますが、これは大きなデータセットでは非常に時間がかかります。おそらくbyの使用を可能にするdatatable'ishの方法があるのでしょうか?

答えて

2

あなたはdata.tableに新しい列を追加する:=を使用することができます。ここでは

TDT <- data.table(Group = c(rep("A",40),rep("B",60)), 
        Id = c(rep(1,20),rep(2,20),rep(3,20),rep(4,20),rep(5,20)), 
        Date = rep(seq(as.Date("2010-01-03"), length=20, by="1 month") - 1,5), 
        x1 = sample(100,100)) 

# add median within groups 
TDT[, median.x1 := as.numeric(median(x1, na.rm = T)), by = .(Group, Date)] 
# compare original values to the median 
TDT[, bellow.median.x1 := x1 < median.x1] 
2

tidyverse

library(tidyverse) 
TDT %>% 
     group_by(Group, Id) %>% 
     mutate(median_x1 = median(x1, na.rm = TRUE), below_median_x1 = x1 < median_x1) 
を使用してオプションです。
関連する問題