2017-04-04 61 views
5

我試圖找到一個妥善的方式,在R,找到重複值,並將其值加1,通過ID分組每個後續重複的值。例如:增量爲一個給每個重複的值R中

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這樣做,但因此它只適用於以下行,並沒有任何後續的行不會遞歸工作。此外,在我的lag功能結果value失去的第一個值。

我已經看到了與make.namesmake.unique字符變量的例子,但一直沒能找到一個重複數值的解決方案。

背景:我在做一個生存分析,我發現與我的數據有停止時間是一樣的,所以我需要使其唯一通過增加1(停止時間以秒爲單位)。

回答

6

這裏是一個嘗試。你基本上由idvalue分組和添加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我明白了。因此,在這裏我們使用「by」來分組,其中.N處理併成爲該組中觀察的總數。用'101'出現3次內ID'1',.N = 3,或'(0:(3-1))'。這導致'value +(0:2)',或簡單地'value + 0,value +1,value + 2'。謝謝! –

5

隨着基礎R我們可以使用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 

一個選項,或者我們可以使用base R沒有匿名函數調用

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