-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
。
非常感谢您
我的数据帧是这样的:修改变量的相同的值中的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
。
非常感谢您
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
我们可以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
是这是基于位置还是一些模式? – akrun
它基于的位置 – Square9627
在这种情况下,下面的工作 – akrun