2016-02-19 13 views
6

グループ化変数byで変数.SDcolsを変えることはできますか?私は次のような状況にあります。.SDcolsを毎年異なる列に変更したいと思っています。 .SDcolsの値は1つのdata.tableにありますが、これらの値を使用して別のテーブルの.SDに関数を適用しようとしています。値を更新しながら、.SDcolsをdata.table内のグループ変数で変更できるようにします。

それはあなただけのシンプルを探しているように私には思える私は明白なアプローチを逃すと、この間違っているのですが、これは私がしようとしたもので、

## Contains the .SDcols applicable to each year 
dat1 <- data.table(
    year = 1:4, 
    vals = lapply(1:4, function(i) letters[1:i]) 
) 

## Make the sample data (with NAs) 
set.seed(1775) 
dat2 <- data.table(year = sample(1:4, 10, TRUE)) 
dat2[, letters[1:4] := replicate(4, sample(c(NA, 1:5), 10, TRUE), simplify=FALSE)] 

## Goal: Sum up the columns in the corresponding .SDcols for each year 
## Attempt, doesn't work -- I think b/c .SDcols must be fixed? 
dat2[, SUM := rowSums(.SD, na.rm=TRUE), by=year, 
    .SDcols=unlist(dat1[year == .BY[[1]], vals])] 

## Desired result, by simply iterating through each possible year 
for (i in 1:4) { 
    dat2[year==i, SUM := rowSums(.SD, na.rm=TRUE), 
    .SDcols=unlist(dat1[year == i, vals])] 
} 

dat2[] 
#  year a b c d SUM 
# 1: 1 3 1 5 1 3 
# 2: 2 1 3 3 1 4 
# 3: 1 5 4 3 NA 5 
# 4: 4 1 NA 4 5 10 
# 5: 2 2 2 2 NA 4 
# 6: 2 NA 3 3 NA 3 
# 7: 4 2 3 2 NA 7 
# 8: 1 2 NA 5 4 2 
# 9: 2 3 3 5 1 6 
# 10: 3 NA 4 2 NA 6 

答えて

6

かなり可能性が高いが参加( dat1by = .EACHI))いずれの方法でも、rowSumsはこの解決法とあなたの試みの両方でボトルネックです(マトリックス変換のため)NAを0に変換して実行します代わりにReduce(`+`,...)(元のデータの値を変更する場合は確信していません)

dat2[dat1, 
     SUM := rowSums(.SD[, unlist(i.vals), with = FALSE], na.rm = TRUE), 
     on = "year", 
    by = .EACHI] 
dat2 
#  year a b c d SUM 
# 1: 1 3 1 5 1 3 
# 2: 2 1 3 3 1 4 
# 3: 1 5 4 3 NA 5 
# 4: 4 1 NA 4 5 10 
# 5: 2 2 2 2 NA 4 
# 6: 2 NA 3 3 NA 3 
# 7: 4 2 3 2 NA 7 
# 8: 1 2 NA 5 4 2 
# 9: 2 3 3 5 1 6 
# 10: 3 NA 4 2 NA 6 

述べたように、私はあなたが、だったら、私はゼロにNA秒に変換し、代わりに

for(j in 2:ncol(dat2)) set(dat2, i = which(is.na(dat2[[j]])), j = j, value = 0L) 
dat2[dat1, 
     SUM := Reduce(`+`, .SD[, unlist(i.vals), with = FALSE]), 
     on = "year", 
    by = .EACHI] 
dat2 
#  year a b c d SUM 
# 1: 1 3 1 5 1 3 
# 2: 2 1 3 3 1 4 
# 3: 1 5 4 3 0 5 
# 4: 4 1 0 4 5 10 
# 5: 2 2 2 2 0 4 
# 6: 2 0 3 3 0 3 
# 7: 4 2 3 2 0 7 
# 8: 1 2 0 5 4 2 
# 9: 2 3 3 5 1 6 
# 10: 3 0 4 2 0 6 
+0

'非公開に(i.vals)は'私は困惑していたものだったReduceを使用することになりますが。私はこれが '.EACHI'問題だと確信していました。 +1 – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto 'i.'もなくても動作します。他のデータにも同様のカラムがある場合には、常に安全のために使用します。エッチの部分? –

関連する問題