Menjumlahkan baris berdasarkan nilai kolom yang cocok di R? [duplikat]

Aug 16 2020
        c1       c2       count 
 1        1        1          20
 2        2        3          50 
 3        1        4          30              

Jadi pada dasarnya saya memiliki data seperti tabel di atas tetapi yang ingin saya lakukan adalah menambahkan kolom baru yang memiliki jumlah setiap baris dibagi dengan jumlah jumlah semua baris dengan nilai c1 yang sama, berakhir dengan sesuatu seperti:

        c1       c2       count    new_col
 1        1        1          20     20/50
 2        2        3          40     40/40
 3        1        4          30     30/50

Seperti yang Anda lihat, kolom baru memiliki jumlah baris dibagi dengan jumlah semua hitungan dengan nilai c1 yang cocok. Jadi yang saya coba adalah seperti ini:

df$new_col <- df$count/sum(df[SUBSET OF ROWS THAT HAVE SAME c1 VALUE]$count)

Saya telah melihat sesuatu seperti df [df $ c1 == some value,] tetapi ini hanya akan berfungsi seperti nilai hard code. Saya juga bisa mencoba menggunakan for loop, tetapi butuh waktu terlalu lama untuk mengulang melalui setiap baris dalam data saya dan tidak pernah selesai berjalan, saya juga tidak tahu semua nilai yang diambil c1. Saya cukup baru mengenal R dan mungkin ada solusi yang sangat sederhana untuk ini tetapi saya belum bisa menemukannya.

Jawaban

3 Duck Aug 16 2020 at 04:06

Coba ini:

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")

Kode:

df %>% group_by(c1) %>% mutate(Sum=sum(count),NewVar=count/Sum)

Keluaran:

# 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 Aug 16 2020 at 04:20

Opsi dasar R melalui 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

atau melalui rowsum(oleh @akrun dari komentar)

> 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

Data

> 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")