首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理data_frame:定义列的值何时更改一个单位

处理data_frame:定义列的值何时更改一个单位
EN

Stack Overflow用户
提问于 2021-06-02 20:02:05
回答 1查看 21关注 0票数 0

我有以下数据结构:

代码语言:javascript
复制
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个单位内改变了他们的状态。我不想将天数视为一个因素,这是一个简单的例子,但在真实的数据集中,天数可以在不同的人之间改变,所以我并不总是有相同的天数。

第一个结果将如下所示:

代码语言:javascript
复制
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个单元的状态。结果会是这样的:

代码语言:javascript
复制
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个单位。

EN

Stack Overflow用户

发布于 2021-06-02 22:30:16

使用by为每个id应用一个函数。

(i)查找days == 5的索引,并检查第一个元素的差异

(ii)使用diff计算向量中连续元素的差,然后查找差为1或-1

代码语言:javascript
复制
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)
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67804715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档