R 将字符串中的重复值替换为0

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

我试图用列中的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     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