我有一个纵向数据
ID<-c(1,1,1,2,2,2,2,3,3,4,4,4)
time<-c(0,12,36,0,7,23,68,0,23,0,32,45)
Age<-rnorm(12,45,9)
Sexe<-c("F","F","F","M","M","M","M","M","M","F","F","F")
biology1<-rnorm(12,12,3)
biology2<-rnorm (12,100,20)
biology3<-rnorm(12,45,9)
biology4<-rnorm(12,20,2)
Death<-c(0,0,1,0,0,0,0,0,0,0,0,1)
data<-data.frame(ID,time,Age,Sexe,biology1,biology2,biology3,biology4,Death)
Run Code Online (Sandbox Code Playgroud)
我想计算每个数值变量(biology1,biology2,biology3,biology4)和每个个体的斜率(从后续开始到结束);主要是一个计算每个变量斜率的函数,而无需为每个变量重新输入新的代码行。我不知道该怎么做。
这是一种方法dplyr。以下是技巧:
group_by对每个人的数据进行分组。summarise为每个组执行一项操作。across对多列执行此操作starts_with选择适当的列list(slope = ...)命名列。$coef提取系数并[2]获取斜率而不是截距。library(dplyr)
data %>%
group_by(ID) %>%
summarise(across(starts_with("biology"),
list(slope = ~lm(. ~ time)$coef[2])))
# A tibble: 4 x 5
ID biology1_slope biology2_slope biology3_slope biology4_slope
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 -0.0459 -1.61 -0.204 -0.00106
2 2 0.131 -0.553 0.0783 -0.0340
3 3 -0.0462 -0.427 -0.402 -0.191
4 4 -0.0524 -1.10 0.379 -0.0736
Run Code Online (Sandbox Code Playgroud)