条件计数随时间的变化?

Mat*_*ert 3 r conditional-operator

我想计算二元因子变量的变化次数.对于每个用户ID,此变量可以不时地多次来回更改.现在我想计算在给定的时间跨度内每个用户id对此变量的更改次数.

数据按id,年,月,myfactor排序.我在MySQL中试过这个但到目前为止没有成功.在R中有一个简单的方法吗?我虽然在我的data.frame中添加了另一个列并逐步添加条件...也许有%的%东西?

请事先提出建议......

嗯,当然......这是一些例子 - 抱歉没有立即提供,我的头疼;):


   myf   Year    month userid   
  1 A    2005       1    260           
  2 B    2005       2    260           
  3 B    2005       4    260           
  4 A    2005       5    260           
  5 B    2005       6    260           
  6 B    2005       1    261 
Run Code Online (Sandbox Code Playgroud)

如果这是我的数据集,我想更新更改列,计算每个用户myf的更改次数.基本上id喜欢最终:

  user  changes
   260     3
   260     0
Run Code Online (Sandbox Code Playgroud)

等等......

HTH

Jor*_*eys 5

另一个编辑:

鉴于您对其他解决方案的回答,您可以在一行中得到您想要的内容:

Data$extra <- ave(as.integer(Data$myf),Data$id,FUN=function(x) sum(diff(x)!=0))
Run Code Online (Sandbox Code Playgroud)

在这种情况下不需要合并.


"超过给定的时间跨度"意味着您可以选择一个时间跨度然后应用该功能.Joshuas的答案是最快的方式.有一个更通用的功能,可以为您提供有关运行长度和值的更多信息rle.一定要检查一下.

根据Joshuas的回答,这个例子向您展示了如何轻松地使用日期来选择给定的时间跨度.

编辑:我更新了答案,向您展示如何轻松地将列年份和月份转换为日期.你应该as.numeric在将整个事物应用于像你这样的因素时使用.

#Testdata
set.seed(21)
Data <- data.frame(id=rep(letters[1:3],each=24),
                   year= rep(rep(c(2005,2006),each=12),6),
                   month=rep(1:12,6),
                   myf=sample(c("A","B"),24*3,TRUE))

#transformation
Data$dates <- as.Date(paste(Data$year,Data$month,"1",sep="-"))
#function

cond.count <- function(from,to,data){
    x <- data[data$dates>from & data$dates<to,]
    tapply(as.numeric(x$myf),x$id,function(y)sum(diff(y)!=0))
}

#example
from <- as.Date("2005-01-01")
to <- as.Date("2006-04-15")

cond.count(from,to,Data)
Run Code Online (Sandbox Code Playgroud)