Satırları R'deki eşleşen sütun değerine göre toplamak [çiftleme]

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

Bu nedenle, esasen yukarıdaki tablo gibi verilere sahibim, ancak yapmak istediğim, her satırın sayısının aynı c1 değerine sahip tüm satırların sayılarının toplamına bölündüğü yeni bir sütun eklemek ve aşağıdaki gibi bir şeyle bitmek

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

Gördüğünüz gibi, yeni sütun satır sayısının c1 değeriyle eşleşen tüm sayıların toplamına bölünmesiyle elde edilir. Yani denediğim şey şuna benzer:

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

Df [df $ c1 == bir değer] gibi bir şey gördüm, ancak bu yalnızca sabit kodlanmış bir değer gibi işe yarar. Ayrıca bir for döngüsü kullanmayı da deneyebilirim, ancak verilerimdeki her bir satırı yinelemek çok uzun sürüyor ve hiçbir zaman çalışmayı bitirmiyor, ayrıca c1'in aldığı tüm değerleri bilmiyorum. R konusunda oldukça yeniyim ve bunun için çok basit bir çözüm olabilir ama henüz bir türlü bulamadım.

Yanıtlar

3 Duck Aug 16 2020 at 04:06

Bunu dene:

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

Kod:

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

Çıktı:

# 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

Bir temel R seçeneği 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

veya rowsum(@akrun tarafından yorumdan)

> 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

Veri

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