आर

2017-04-04 2 views
5

में प्रत्येक डुप्लिकेट मान में एक से बढ़ोतरी, मैं डुप्लिकेट मानों को खोजने के लिए आर में उचित तरीके खोजने की कोशिश कर रहा हूं, और आईडी द्वारा समूहित प्रत्येक बाद के डुप्लिकेट मान में मान 1 जोड़ सकता हूं। उदाहरण के लिए:आर

data=data.table(id=c('1','1','1','1','1','2','2','2'),value=c(95,100,101,101,101,20,35,38)) 
data$new_value <- ifelse(data[,data$value] == lag(data$value,1), lag(data$value,1)+1 ,data$value) 
data$desired_value <- c(95,100,101,102,103,20,35,38) 

का उत्पादन:

id value new_value desired_value 
1: 1 95  NA   95 
2: 1 100  100   100 
3: 1 101  101   101 
4: 1 101  102   102 
5: 1 101  102   103 
6: 2 20  20   20 
7: 2 35  35   35 
8: 2 38  38   38 

मैं ifelse के साथ ऐसा करने की कोशिश की लेकिन यह रिकर्सिवली काम नहीं करता है तो यह केवल निम्न पंक्ति पर लागू होता है, और नहीं किसी भी बाद पंक्तियों। फ़ंक्शन के परिणाम में मुझे value में पहला मान खोने का परिणाम मिला।

मैंने make.names या make.unique के साथ वर्ण चर के साथ उदाहरण देखे हैं, लेकिन एक डुप्लिकेट किए गए संख्यात्मक मान के लिए समाधान नहीं ढूंढ पाए हैं।

पृष्ठभूमि: मैं एक जीवित विश्लेषण कर रहा हूं और मुझे लगता है कि मेरे डेटा के साथ स्टॉप टाइम्स समान हैं, इसलिए मुझे इसे 1 जोड़कर अद्वितीय बनाना होगा (स्टॉप टाइम्स सेकंड में हैं)।

उत्तर

6

यहां एक प्रयास है। आप अनिवार्य रूप से id और value द्वारा समूहित कर रहे हैं और 0:(length(value)-1) जोड़ रहे हैं। तो:

data[, onemore := value + (0:(.N-1)), by=.(id, value)] 

# id value new_value desired_value onemore 
#1: 1 95  96   95  95 
#2: 1 100  101   100  100 
#3: 1 101  102   101  101 
#4: 1 101  102   102  102 
#5: 1 101  102   103  103 
#6: 2 20  21   20  20 
#7: 2 35  36   35  35 
#8: 2 38  39   38  38 
+1

@akrun बिना और @thelatemail मैं देख रहा हूँ base R उपयोग कर सकते हैं। तो यहां हम समूह द्वारा "बाय" का उपयोग करते हैं, जो कि उस समूह में अवलोकनों की कुल संख्या को संभालता है और बन जाता है। '101' आईडी' 1' के भीतर 3 बार दिखाई देने के साथ, एन = 3, या '(0: (3-1))'। इसके परिणामस्वरूप 'मान + (0: 2) ', या बस' मान + 0, मान +1, मान + 2' होता है। धन्यवाद! –

5

आधार आर के साथ हम ave उपयोग कर सकते हैं, जहां हम प्रत्येक समूह के प्रथम मान लेते हैं और मूल रूप से उस समूह में उस पंक्ति की पंक्ति संख्या जोड़ें।

data$value1 <- ave(data$value, data$id, data$value, FUN = function(x) 
                 x[1] + seq_along(x) - 1) 

# id value new_value desired_value value1 
#1: 1 95  96   95  95 
#2: 1 100  101   100 100 
#3: 1 101  102   101 101 
#4: 1 101  102   102 102 
#5: 1 101  102   103 103 
#6: 2 20  21   20  20 
#7: 2 35  36   35  35 
#8: 2 38  39   38  38 
1

यहाँ tidyverse

library(dplyr) 
data %>% 
    group_by(id, value) %>% 
    mutate(onemore = value + row_number()-1) 
#  id value onemore 
# <chr> <dbl> <dbl> 
#1  1 95  95 
#2  1 100  100 
#3  1 101  101 
#4  1 101  102 
#5  1 101  103 
#6  2 20  20 
#7  2 35  35 
#8  2 38  38 

साथ एक विकल्प है या हम अनाम समारोह कॉल

data$onemore <- with(data, value + ave(value, id, value, FUN =seq_along)-1) 
data$onemore 
#[1] 95 100 101 102 103 20 35 38 
+0

समाधान के साथ समस्या क्या है? वैध समाधान क्यों कम करना है? – akrun