2016-06-07 55 views
-2

我的數據幀是這樣的:修改變量的相同的值中的R

Name No 
X  1 
X  3 
YYY 1 
YYY 6 
X  8 
X  2 
X  1 

欲最後3 X的名稱更改爲不X(X1例如)。基本上相同的值但不是連續的必須修改。在我的Name變量中有很多這樣的情況。有沒有辦法在R中做到這一點?這很像SAS中的not-sorted

非常感謝您

+0

是這是基於位置還是一些模式? – akrun

+0

它基於的位置 – Square9627

+0

在這種情況下,下面的工作 – akrun

回答

4

rle表明自己在這裏爲「值相同,但不連續的,必須修改

r <- rle(as.character(df$Name)) 
#Run Length Encoding 
# lengths: int [1:3] 2 2 3 
# values : chr [1:3] "X" "YYY" "X" 

r$values <- make.unique(r$values,sep="") 
inverse.rle(r) 
#[1] "X" "X" "YYY" "YYY" "X1" "X1" "X1" 

df$Name <- inverse.rle(r) 
df 

# Name No 
#1 X 1 
#2 X 3 
#3 YYY 1 
#4 YYY 6 
#5 X1 8 
#6 X1 2 
#7 X1 1 
1

我們可以ave

inverse.rle(within.list(rle(df1$Name), { 
      v1 <- ave(seq_along(values), values, FUN = seq_along)-1 
      values <- paste0(values, replace(v1, !v1, ''))})) 
#[1] "X" "X" "YYY" "YYY" "X1" "X1" "X1" 

注意,只有簡單base R功能

df1$Name <- with(df1, paste0(Name, cumsum(c(TRUE, Name[-1]!= Name[length(df1)])), 
     Name, FUN = function(x) { 
       x1 <- match(x, unique(x))-1 
       replace(x1, !x1, "")}))) 
df1 
# Name No 
#1 X 1 
#2 X 3 
#3 YYY 1 
#4 YYY 6 
#5 X1 8 
#6 X1 2 
#7 X1 1 

或者使用rle做到這一點:上述解決方案給出了OP提到的預期產出後,不包括任何.


或者另一種選擇是

library(data.table) 
setDT(df1)[, gr := rleid(Name)] 
unique(df1[, c("Name", "gr"), with = FALSE])[, 
    Name := make.unique(Name)][df1, on = 'gr'][, 2:3 := NULL][] 
# Name No 
#1: X 1 
#2: X 3 
#3: YYY 1 
#4: YYY 6 
#5: X.1 8 
#6: X.1 2 
#7: X.1 1