Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计数对字符向量内容的更改_R_Dplyr - Fatal编程技术网

R 计数对字符向量内容的更改

R 计数对字符向量内容的更改,r,dplyr,R,Dplyr,我有一个数据帧,其中字符变量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 我可以尝试rep()。我也试过这个,非常接近,但不是因为我不能马

我有一个
数据帧
,其中字符变量
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
我可以尝试
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
inverse.rle(在.list(rle(as.character(df$x))内),

值尝试此
dplyr
code:

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行)上没有变量,则增加计数。

Ah。为了避免引入
data.table
,我实际做的是复制代码
rleid=function(x){r=rle(x);rep(1:length(r$length),r$length)}
from@gregmacfarlane也可以,但是,
rleid
是一个很好的包装函数是的,它是一个很好的函数。事实上,这很像我在与
rle()争吵时所想的
output。但就我的目的而言,在脚本中包含该函数要比引入
data.table
和担心名称冲突更容易。
rleid()
也可以处理多个列(并且是用C编写的,以提高速度)。@gregmacfarlane,您担心什么名称冲突?
last()
,主要是。我意识到我可以显式地或在之后加载
dplyr
。但是对于我们的应用程序来说,不使用
data.table
。您创建了data.frame(),这是使用data\u frame()创建的原始帖子是的,如果我使用你文章中的
data.frame
,但加上
df$x,你可以缩短代码
mutate(df,try_1=cumsum(x!=lag(x)| is.na(lag(x)))
as
TRUE/FALSE
将通过累积值强制为数值
1/0
default
也可以使用
lag
中的
mutate(df,try_1=cumsum(x!=lag(x,default=1))
df <- data.frame(x=c("a", "a", "b", "b", "c", "b"))
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