2016-06-07 68 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