2017-02-24 16 views
5

द्वारा वृद्धि मैं प्रति समूह एक कॉलम बढ़ाने की कोशिश कर रहा हूं। तो यदि कोई मूल्य है तो हम इसे इसके मूल्य के आधार पर बढ़ाते हैं, अन्यथा हम इसे छोड़ देते हैं।समूह

तो उदाहरण के लिए यह डीएफ से डीएफबी तक जाएगा।

df <- data.frame(group = c("A", "A", "B", "B", "B", "C", "C", "C", "D", "D"), 
       num = c(1, NA, NA, 8, NA, 5, NA, NA, 10, NA)) 
dfb <- data.frame(group = c("A", "A", "B", "B", "B", "C", "C", "C", "D", "D"), 
       num = c(1, 2, NA, 8, 9, 5, 6, 7, 10, 11)) 
> df 

    group num 
1  A 1 
2  A NA 
3  B NA 
4  B 8 
5  B NA 
6  C 5 
7  C NA 
8  C NA 
9  D 10 
10  D NA 

> dfb 
    group num 
1  A 1 
2  A 2 
3  B NA 
4  B 8 
5  B 9 
6  C 5 
7  C 6 
8  C 7 
9  D 10 
10  D 11 

मेरे सबसे अच्छे प्रयास यह था, लेकिन यह काम नहीं किया

dfc <- df %>% 
    mutate(num = ifelse(is.na(num),lag(num) + 1, num)) 

मेरे पिछले प्रश्न हटाए गए क्योंकि मेरी समस्या पहले से बुरी तरह से परिभाषित किया। मदद के लिए धन्यवाद!

+0

यह क्योंकि नष्ट कर दिया एक में मेरी समाधान नया उदाहरण के साथ के रूप में अच्छी तरह से काम करता है क्यों आप पहले प्रश्न हटा स्पष्ट नहीं है – akrun

उत्तर

5

हम

df %>% 
group_by(grp1= cumsum(!is.na(num)), group) %>% 
mutate(num = if(n() > 1) num[1L] + row_number()-1 else num) %>% 
ungroup() %>% 
select(-grp1) 
# A tibble: 10 × 2 
# group num 
# <fctr> <dbl> 
#1  A  1 
#2  A  2 
#3  B NA 
#4  B  8 
#5  B  9 
#6  C  5 
#7  C  6 
#8  C  7 
#9  D 10 
#10  D 11 

या data.table

library(data.table) 
setDT(df)[, num := if(.N >1) num[1L] + seq_len(.N)-1 
      else num,.(grp1=cumsum(!is.na(num)), group)] 
1

साथ आप सभी की जरूरत है पाश :) चियर्स के लिए एक बुनियादी था कर सकते हैं!

df <- data.frame(group = c("A", "A", "B", "B", "B", "C", "C", "C", "D", "D"), 
       num = c(1, NA, NA, 8, NA, 5, NA, NA, 10, NA)) 
df.new <- df 

for(i in 2:dim(df.new)[1]){ 

    if(!is.na(df[i - 1, 'num'])){ 

    df.new[i, 'num'] <- df[i - 1, "num"] + 1 

    } 
+0

यह एक पाश में किया जा सकता है लेकिन आम तौर पर छोरों धीमी गति से कर रहे हैं लेकिन इससे भी महत्वपूर्ण इस गणना का हिस्सा था एक बड़ी पाइपलाइन। यद्यपि सहायता के लिए धन्यवाद! – tonyk