我有以下数据结构:
iid<-c(rep("I1",5),rep("I2",5),rep("I3",5),rep("I4",5))
days<-rep(c(0,2,5,7,14),4)
estatus<-c(4,4,4,3,3,
5,4,4,4,3,
4,4,4,4,4,
5,4,4,3,2)
data<-as.data.frame(cbind(iid,days,estatus))我对获得不同的结果很感兴趣,这些结果都与变量" status“的变化有关。首先,我想知道在第5天之前,有多少人(iid)在1个单位内改变了他们的状态。我不想将天数视为一个因素,这是一个简单的例子,但在真实的数据集中,天数可以在不同的人之间改变,所以我并不总是有相同的天数。
第一个结果将如下所示:
iid<-c("I1","I2","I3","I4")
res_5<-c(0,1,0,1)
results_1<-as.data.frame(cbind(iid,res_5))I1和I3的1台设备的状态没有发生变化。
我感兴趣的第二个结果是知道每个个体的状态在哪一天改变了1个单元的状态。结果会是这样的:
iid<-c("I1","I2","I3","I4")
res_d<-c(7,2,NA,2)
results_1<-as.data.frame(cbind(iid,res_d))我想我已经得到了问题的第一部分,因为我知道如何使用tidyverse或dplyr通过iid进行聚合。然而,我不知道如何检查某一行是比前一行高出还是低于前一行1、2或n个单位。
发布于 2021-06-02 22:30:16
使用by为每个id应用一个函数。
(i)查找days == 5的索引,并检查第一个元素的差异
(ii)使用diff计算向量中连续元素的差,然后查找差为1或-1
iid <- c(rep("I1", 5), rep("I2", 5), rep("I3", 5), rep("I4", 5))
days <- rep(c(0, 2, 5, 7, 14), 4)
estatus <- c(
4, 4, 4, 3, 3,
5, 4, 4, 4, 3,
4, 4, 4, 4, 4,
5, 4, 4, 3, 2
)
data <- data.frame(iid = iid, days = days, estatus = estatus)
my_func1 <- function(x) {
ind5 <- which(x$days == 5)
d <- x$estatus[ind5] - x$estatus[1]
return((d == 1) | (d == -1))
}
by(data, data$iid, my_func1)
my_func2 <- function(x) {
d <- diff(x$estatus)
hasChangeOf1 <- (d == 1) | (d == -1)
return(x$days[which(hasChangeOf1)[1] + 1])
}
by(data, data$iid, my_func2)https://stackoverflow.com/questions/67804715
复制相似问题