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
另一个编辑:
鉴于您对其他解决方案的回答,您可以在一行中得到您想要的内容:
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)