आर में मिलान स्तंभ मान पर आधारित पंक्तियों को जोड़ते हुए? [डुप्लिकेट]

Aug 16 2020
        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

जैसा कि आप देख सकते हैं, नए कॉलम में पंक्ति की गिनती को सभी गणनाओं के योग द्वारा विभाजित किया गया है जो सी 1 मान से मेल खाते हैं। तो जो मैं कोशिश कर रहा हूं वह कुछ इस तरह है:

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

मैंने df [df $ c1 == कुछ मूल्य] जैसा कुछ देखा है, लेकिन यह केवल एक कठिन कोडित मूल्य की तरह काम करेगा। मैं लूप के लिए भी प्रयास कर सकता था, लेकिन मेरे डेटा में हर एक पंक्ति के माध्यम से पुनरावृति करने के लिए बहुत लंबा रास्ता तय करता है और कभी भी समाप्त नहीं होता है, मुझे उन सभी मानों की भी जानकारी नहीं है जो c1 लेता है। मैं आर के लिए बहुत नया हूं और इसका एक बहुत ही सरल समाधान हो सकता है लेकिन मैं इसके साथ नहीं आ पाया हूं।

जवाब

3 Duck Aug 16 2020 at 04:06

इसे इस्तेमाल करे:

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

आधार 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")