R 将字符串中的重复值替换为0
我试图用列中的0替换连续的1或2。我似乎想不出一种方法来实现这一点,除了一个循环,它并不真正符合R的最佳实践。有人能提供如何以“R方式”实现这一点的提示吗 我的(非工作)尝试:R 将字符串中的重复值替换为0,r,R,我试图用列中的0替换连续的1或2。我似乎想不出一种方法来实现这一点,除了一个循环,它并不真正符合R的最佳实践。有人能提供如何以“R方式”实现这一点的提示吗 我的(非工作)尝试: 将rleid与重复的一起使用: library(data.table) df$goal <- df$vals df$goal[duplicated(rleid(df$goal))] <- 0 df vals goal 1 1 1 2 1 0 3 2 2 4
将
rleid
与重复的一起使用:
library(data.table)
df$goal <- df$vals
df$goal[duplicated(rleid(df$goal))] <- 0
df
vals goal
1 1 1
2 1 0
3 2 2
4 1 1
5 1 0
6 1 0
7 1 0
8 2 2
9 1 1
10 1 0
我们可以使用diff
检查一个值是否与前面的值相同:
df$goal<- df$vals
df$goal[-1] <- ifelse(diff(df$vals)==0, 0, df$vals[-1])
df
vals out
1 1 1
2 1 0
3 2 2
4 1 1
5 1 0
6 1 0
7 1 0
8 2 2
9 1 1
10 1 0
df$goal我们可以从base R使用rle
。
df$vals *!duplicated(inverse.rle(within.list(rle(df$vals),
values <-seq_along(values))))
#[1] 1 0 2 1 0 0 0 2 1 0
返回两个元素的列表
,即“长度”和“值”,其中长度
具有每个重复相邻元素的长度。由于它是一个列表
,我们在.list中使用循环,将“值”更改为“值”序列
within.list(rle(df$vals), values <-seq_along(values))
# Run Length Encoding
# lengths: int [1:5] 2 1 4 1 2
# values : int [1:5] 1 2 3 4 5 ## changed
我们使用
duplicated(inverse.rle(within.list(rle(df$vals), values <-seq_along(values))))
#[1] FALSE TRUE FALSE FALSE TRUE TRUE TRUE FALSE FALSE TRUE
TRUE/FALSE
存储为1/0
。因此,当与1/0相乘时,如果您使用的是data.table,那么与0对应的元素将返回0。无论如何,为什么不使用setDT(df)[,goal:=vals][duplicated(rleid(vals)),goal:=0]
@docendodiscimus-Yep。我们也可以这样做。很好的语法。或者,类似地,df$vals[diff(df$vals)==0)+1L]我将插入我的rle
或我自己的sekle
。这非常有效,但我不太理解reverse.rle
的用法,然后rle
。你能再解释一下吗?太棒了,谢谢!
df$goal <- df$vals
df$goal[df$vals == shift(df$vals)] <- 0
val goal
1 1 1
2 2 2
3 2 0
4 2 0
5 1 1
6 1 0
7 1 0
df$goal<- df$vals
df$goal[-1] <- ifelse(diff(df$vals)==0, 0, df$vals[-1])
df
vals out
1 1 1
2 1 0
3 2 2
4 1 1
5 1 0
6 1 0
7 1 0
8 2 2
9 1 1
10 1 0
df$goal[which(diff(df$vals) == 0) +1L] <- 0
df$vals *!duplicated(inverse.rle(within.list(rle(df$vals),
values <-seq_along(values))))
#[1] 1 0 2 1 0 0 0 2 1 0
rle(df$vals)
#Run Length Encoding
#lengths: int [1:5] 2 1 4 1 2
# values : num [1:5] 1 2 1 2 1
within.list(rle(df$vals), values <-seq_along(values))
# Run Length Encoding
# lengths: int [1:5] 2 1 4 1 2
# values : int [1:5] 1 2 3 4 5 ## changed
inverse.rle(within.list(rle(df$vals), values <-seq_along(values)))
#[1] 1 1 2 3 3 3 3 4 5 5
duplicated(inverse.rle(within.list(rle(df$vals), values <-seq_along(values))))
#[1] FALSE TRUE FALSE FALSE TRUE TRUE TRUE FALSE FALSE TRUE
!duplicated(inverse.rle(within.list(rle(df$vals), values <-seq_along(values))))
#[1] TRUE FALSE TRUE TRUE FALSE FALSE FALSE TRUE TRUE FALSE