计算字符向量内容的变化
Count changes to contents of a character vector
我有一个 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)
相似但不同,return
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
似乎应该有一个函数可以直接执行此操作,但我在我的经验中还没有找到。
你可以试试
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"))
试试这个 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 行),则增加计数。
我有一个 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)
相似但不同,return
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
似乎应该有一个函数可以直接执行此操作,但我在我的经验中还没有找到。
你可以试试
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"))
试试这个 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 行),则增加计数。