2014-08-27 21 views
5

का उपयोग किए बिना टिप्पणियों और योग डेटा गिनती मैं आर dplyr पैकेज का उपयोग करने के छोरों का उपयोग किए बिना निम्नलिखित अंतराल संबंधित प्रश्नों की गणना करना चाहते हैं:dplyr और अंतराल: लूप

  1. मैं प्रत्येक में टिप्पणियों गिनती करने के लिए चाहते हैं अंतराल (निरपेक्ष और सापेक्ष अंतराल समाप्ति-बिंदु)
  2. मैं प्रत्येक अंतराल में अवलोकन डेटा योग करने के लिए चाहते हैं (निरपेक्ष और सापेक्ष अंतराल समाप्ति-बिंदु)

अंतराल समाप्ति-बिंदु स्तंभों से कर रहे हैं $ अंतराल और df_rel $ अंतराल df_abs। जैसे

  1. अंतराल: (-inf, -60]
  2. अंतराल: (-60, -30]
  3. अंतराल: (-30,0]

डेटा डेटा के साथ फ्रेम और अंतराल इस तरह दिखेगा:

library(dplyr) 

# ----------{ data and interval ---------- 
df_data <- data.frame(varA = NA, 
         varB = NA, 
         varC = c(-81.0, -14.3, 29.6, 42.7, 46.4, 57.7, 15.3, 256.3, 20.3, -25.1, -23.1, -17.5)) 

df_abs <- data.frame(interval = c(-Inf, -60, -30, 0, 30, 60, 100, 200, Inf), 
        count = NA, 
        sum = NA) 

df_rel <- data.frame(interval = c(0,5,15,50,75,95,100), 
        count = NA, 
        sum = NA) 
# ---------- data and interval }---------- 


# ----------{ calculation ----------  
# absolute data frame 
for (i in 1 : nrow(df_abs)-1) { 
    # count observation between interval 
    df_abs$count[i+1] <- summarise(df_data, sum(df_abs$interval[i] < varC & varC <= df_abs$interval[i+1])) 

    # sum between interval 
    df_abs$sum[i+1] <- sum(df_data$varC[df_abs$interval[i] < df_data$varC & df_data$varC <= df_abs$interval[i+1]]) 
} 


# relative data frame 
df_data_arranged <- df_data %>% 
         arrange(varC) %>% 
         mutate(observationPercent = c(1:nrow(df_data)) * 100/length(df_data$varC)) 


for (i in 1 : nrow(df_rel)-1) { 
    # count observation between interval 
    df_rel$count[i+1] <- summarise(df_data_arranged, sum(df_rel$interval[i] < observationPercent & observationPercent <= df_rel$interval[i+1])) 

    # sum between interval 
    df_rel$sum[i+1] <- sum(df_data_arranged$varC[df_rel$interval[i] < df_data_arranged$observationPercent & df_data_arranged$observationPercent <= df_rel$interval[i+1]]) 
}  
# ---------- calculation }---------- 

जवाब इस तरह दिखना चाहिए:

df_abs <- data.frame(interval = c(-Inf, -60, -30, 0, 30, 60, 100, 200, Inf), 
        count = c(0,1,0,4,3,3,0,0,1), 
        sum = c(0,-81,0,-80,65.2,146.8,0,0,256.3))  

df_rel <- data.frame(interval = c(0,5,15,50,75,95,100), 
        count = c(0,0,1,4,3,2,1), 
        sum = c(0,0,-81,-39.6,92.6,104.1,256.3)) 

जहां तक ​​मैं dplyr पैकेज को समझता हूं, वहां दो समस्याओं में से प्रत्येक के लिए लूप का उपयोग किए बिना एक छोटा और सीधा आगे समाधान होना चाहिए।

उत्तर

2

यह इस प्रकार किया जा सकता है:

  • जो अवलोकन अंतर्गत आता है पहचान करने के लिए एक नया स्तंभ (mutate) बनाने के जो अंतराल (base::cut के माध्यम से)

  • समूह अंतराल द्वारा अपनी टिप्पणियों (group_by) करने के लिए

  • परिणाम पर अपने परिचालन लागू करें (summarisedplyr के n() और सह mmon sum यहाँ)

के रूप में इस प्रकार है:

df_abs <- mutate(df_data, interval = cut(varC, df_abs$interval)) %>% 
    group_by(interval) %>% 
    summarise(count=n(), sum=sum(varC)) 
#  interval count sum 
#1 (-Inf,-60]  1 -81.0 
#2 (-30,0]  4 -80.0 
#3  (0,30]  3 65.2 
#4 (30,60]  3 146.8 
#5 (200, Inf]  1 256.3 

df_rel <- mutate(df_data_arranged, 
       interval = cut(observationPercent, df_rel$interval)) %>% 
    group_by(interval) %>% 
    summarise(count=n(), sum=sum(varC)) 
# interval count sum 
#1 (5,15]  1 -81.0 
#2 (15,50]  5 -64.7 
#3 (50,75]  3 92.6 
#4 (75,95]  2 104.1 
#5 (95,100]  1 256.3