-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