2017-03-08 6 views
1

私は、IDの列、他のIDのリスト、および値を持つデータフレームを持っています。リスト列のIDの値の合計で新しい列を作成しようとしています。R - 別の変数のリストに含まれる特定のレベルで変数を合計するにはどうすればよいですか?

例えば

:我々は、行5、7、8のデータを持っていないので、ここで

ID x    Value  New Column 
1 c(2,3,4)   6   17 
2 c(1,3,4,7,8,9) 8 
3 c(1,2)   4   14 
4 c(1,3,5)   5 

は、我々は2番目と4番目の列で新しい列の値を知らない、と9.最初の行の新しい列は8 + 4 + 5、または17です。実際のデータフレームには欠落データはありません。

データフレーム内のすべての行に対してこれを行うにはどうすればよいですか?

ありがとうございます!

+0

は 'リスト(C(2,3,4)のような' DF $ X '実際のリストであり、 c(1,3,4,7,8,9)) 'またはそれは文字変数ですか? – thelatemail

+0

実際のリストです –

答えて

0

このような構造を維持しようとするとかなりのオーバーヘッドが発生すると思います。ものを構造化する別の方法を提案してもいいでしょうか?

A "値" 単に各idvalueとdata.frame、彼らが持っている:

values <- data.frame(id = 1:4, value = c(6,8,4,5)) 

idため、id秒dependent-マップがそれに加算され、別のdata.frame:

inclusions <- data.frame(
    id = c(1,1,1, 2,2,2,2,2,2, 3,3, 4,4,4), 
    useid = c(2,3,4, 1,3,4,7,8,9, 1,2, 1,3,5) 
) 

ここから、必要なものを得るためにいくつかの結合を行うだけです。それはそれで便利ですあなたは、サブdata.frameリストを解析しようとする必要はありません、など

library(dplyr) 
full_join(inclusions, values, by = c("useid" = "id")) %>% 
    select(-useid) %>% 
    group_by(id) %>% 
    summarize(newvalue = sum(value)) 
# # A tibble: 4 × 2 
#  id newvalue 
# <dbl> <dbl> 
# 1  1  17 
# 2  2  NA 
# 3  3  14 
# 4  4  NA 

最初の参加で、一部欠損値があるので、NA sがようNA後にsumを引き起こしますよく便利。

0

は、ルックアップのビットを行う:

dfだった
sapply(df$x, function(x) sum(df$Value[match(x, df$ID)])) 
#[1] 17 NA 14 NA 

df <- data.frame(
    ID = 1:4, x = I(list(c(2,3,4), c(1,3,4,7,8,9), c(1,2), c(1,3,5))), 
    Value = c(6L, 8L, 4L, 5L)) 
関連する問題