计算对字符向量内容的更改

gre*_*ane 2 r dplyr

我有一个data_frame字符变量x随时间变化的地方.我想计算它改变的次数,并用这个计数填充一个新的向量.

df <- data_frame(
  x = c("a", "a", "b", "b", "c", "b"),
  wanted = c(1, 1, 2, 2, 3, 4)
)
  x wanted
1 a      1
2 a      1
3 b      2
4 b      2
5 c      3
6 b      4
Run Code Online (Sandbox Code Playgroud)

这与rle(df$x)将返回的类似但不同

Run Length Encoding
  lengths: int [1:4] 2 2 1 1
  values : chr [1:4] "a" "b" "c" "b"
Run Code Online (Sandbox Code Playgroud)

我可以尝试rep()输出.我也试过这个,非常接近,但不是因为我无法立即弄清楚的原因:

 df %>% mutate( 
   try_1 = cumsum(ifelse(x == lead(x) | is.na(lead(x)), 1, 0)) 
   )
Source: local data frame [6 x 3]

  x wanted try_1
1 a      1     1
2 a      1     1
3 b      2     2
4 b      2     2
5 c      3     2
6 b      4     3
Run Code Online (Sandbox Code Playgroud)

似乎应该有一个直接执行此功能的功能,我根本没有找到我的经验.

Sam*_*rke 6

试试这段dplyr代码:

df %>%
  mutate(try_1 = cumsum(ifelse(x != lag(x) | is.na(lag(x)), 1, 0)))

  x wanted try_1
1 a      1     1
2 a      1     1
3 b      2     2
4 b      2     2
5 c      3     3
6 b      4     4
Run Code Online (Sandbox Code Playgroud)

你的意思是:如果一个值与下一行的值相同,或者下一行的值是NA,则递增计数.

这表示:如果此行上的变量与前一行上的变量不同,或者如果前一行中没有变量(例如,行1),则递增计数.

  • 你可以缩短代码`mutate(df,try_1 = cumsum(x!= lag(x)| is.na(lag(x))))```TRUE/FALSE`将强制转换为数值`1/0通过cumsum (2认同)