Rの一致する列値に基づいて行を合計しますか?[複製]
c1 c2 count
1 1 1 20
2 2 3 50
3 1 4 30
したがって、基本的に上記の表のようなデータがありますが、各行のカウントを同じc1値を持つすべての行のカウントの合計で割った新しい列を追加すると、次のようになります。
c1 c2 count new_col
1 1 1 20 20/50
2 2 3 40 40/40
3 1 4 30 30/50
ご覧のとおり、新しい列には、行のカウントが、c1値が一致するすべてのカウントの合計で除算されています。だから私が試しているのは次のようなものです:
df$new_col <- df$count/sum(df[SUBSET OF ROWS THAT HAVE SAME c1 VALUE]$count)
df [df $ c1 == some value]のようなものを見たことがありますが、これはハードコードされた値のようにのみ機能します。forループを使用することもできますが、データ内のすべての行を反復処理するのに時間がかかりすぎて、実行が終了しません。また、c1が取るすべての値もわかりません。私はRにかなり慣れていないので、これに対する非常に簡単な解決策があるかもしれませんが、私はそれを思い付くことができませんでした。
回答
3 Duck
これを試して:
library(dplyr)
#Data
df <- structure(list(c1 = c(1L, 2L, 1L), c2 = c(1L, 3L, 4L), count = c(20,
40, 30)), row.names = c("1", "2", "3"), class = "data.frame")
コード:
df %>% group_by(c1) %>% mutate(Sum=sum(count),NewVar=count/Sum)
出力:
# A tibble: 3 x 5
# Groups: c1 [2]
c1 c2 count Sum NewVar
<int> <int> <dbl> <dbl> <dbl>
1 1 1 20 50 0.4
2 2 3 40 40 1
3 1 4 30 50 0.6
2 ThomasIsCoding
経由のベースRオプション ave
> within(df,new_col <- count/ave(count,c1,FUN = sum))
c1 c2 count new_col
1 1 1 20 0.4
2 2 3 40 1.0
3 1 4 30 0.6
または経由rowsum
(コメントから@akrunによる)
> within(df,new_col <- count/rowsum(count,c1)[c1])
c1 c2 count new_col
1 1 1 20 0.4
2 2 3 40 1.0
3 1 4 30 0.6
データ
> dput(df)
structure(list(c1 = c(1L, 2L, 1L), c2 = c(1L, 3L, 4L), count = c(20,
40, 30)), row.names = c("1", "2", "3"), class = "data.frame")