2017-12-07 5 views
2

2つのリストで操作しようとすると、エラーメッセージが表示され、計算が正しく機能しません(質問の終わりを参照)R- 2番目のリストと混合した条件に基づいた列からの値の合計を取得する

list2 <- list2 %>% 
mutate(sum_of_part = sum(list1$part[(list1$id < list2$id) & (list1$id >= lag(list2$id))])) 

私がしたいことは次のとおりです。 "id"がlist2の現在の行の "id"と行の "id"の間にあるlist1のすべての行の "part"前。 また、列sum_of_partsを計算するために使用される行の数を数えたいと思います。

リスト1

id Part ... 
    1  2 
    2  3 
    3  4 
    4  6 
    99  11 
    100  11 
    191 11 
    222  11 
    333 11 

list2の

id ... 
1 
3 
4 
88 
99 

ソリューション

id ... sum_of_parts count 
1 ...  2   1 
3 ...  9   3 
4 ...  10   2 
88 ...  6   1 
99 ...  11   1 

しかし、私のリスト2は、私のリスト1その後、たくさん小さいので、私はこのエラーを取得します(存在するいくつかのより多くの彼らはほぼ同じに見える): in list1 $ id < list2 $ id:longeオブジェクトの長さはオブジェクトの長さの倍数ではありません お願いします。

答えて

0

あなたは本当に近くにいた、これは私のすべての時間を取得します!

mutateグループによって運営されていると思いますので、グループを指定していないと、ベクター化された操作(通常はより効率的です)で列全体を使用しようとします。

各行で操作する場合は、rowwise()を使用して、次の計算で各行をグループとして扱うことができます。したがって、idmutateコールの長さ1のベクトルになります。

グループ化する前に遅延を指定する必要があります。それ以外の場合は、上記のロジックを使用して、長さ1のベクトルに前のidはありません。

library(dplyr) 

list1 <- readr::read_csv(
'id,part 
1,2 
2,3 
3,4 
4,6 
99,11 
100,11 
191,11 
222,11 
333,11') 

list2 <- readr::read_csv(
'id 
1 
3 
4 
88 
99' 
) 

list2 %>% 
    mutate(lag_id = lag(id, default = 0)) %>% 
    rowwise() %>% 
    mutate(sum_of_part = sum(list1$part[(list1$id <= id) & (list1$id > lag_id)]), 
     count = length(list1$part[(list1$id <= id) & (list1$id > lag_id)])) %>% 
    select(-lag_id) 
#> Source: local data frame [5 x 3] 
#> Groups: <by row> 
#> 
#> # A tibble: 5 x 3 
#>  id sum_of_part count 
#> <int>  <int> <int> 
#> 1  1   2  1 
#> 2  3   7  2 
#> 3  4   6  1 
#> 4 88   0  0 
#> 5 99   11  1 
+1

あなたの代わりに明示的にグループ(キー)を指定し、それによってグループ分けの 'rowwise'を使用することができます。 – jjl

+0

偉大なアイデア、はるかに読みやすく簡潔です。これは、あまりにも多くの不要な入力を将来節約できます:) – hrabel

+0

count2の推測にlist2 $ id-lag(list2 $ id)を使用できました。あなたの答えをありがとう。それは動作し、それは私を救った:)) – Haze

関連する問題