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

时间:2015-03-31 18:47:10

标签: 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

这与rle(df$x)类似,但与Run Length Encoding lengths: int [1:4] 2 2 1 1 values : chr [1:4] "a" "b" "c" "b" 不同,后者会返回

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 输出。我也试过这个,非常接近,但不是因为我无法立即弄清楚的原因:

{{1}}

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

2 个答案:

答案 0 :(得分:5)

试试这个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

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

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

答案 1 :(得分:4)

你可以尝试

library(data.table) #data.table_1.9.5
setDT(df)[, wanted := rleid(x)][]
#    x wanted
#1: a      1
#2: a      1
#3: b      2
#4: b      2
#5: c      3
#6: b      4

base R选项

inverse.rle(within.list(rle(as.character(df$x)),
                          values<- seq_along(values)))
#[1] 1 1 2 2 3 4

数据

df <- data.frame(x=c("a", "a", "b", "b", "c", "b"))