使用 R 计算大型数据集中每一行的斜率

Calculating the slope of each row in a large data set using R

我有一大堆 data set 以下 format: 第一列是 typesubsequent columns'type' 发生的不同时间。我想为 subset T0-T2t0-t2 计算每个 row (~7000 rows) 的斜率并输出该信息,然后得到每行斜率的平均值。例如,获取类型 1 的子集 T0-T2 和 t0-t2 的斜率,然后获取行类型 1 的两个值的平均值。 有些行完全缺少数据,而有些行缺少一个或两个值。

Type    T0   T1   T2   t0   t1   t2  
type1  0.2  0.3  0.4  0.3  0.2  0.1 
type2  1.4  2.5  3.4  1.5  0.5  3.4
type3  0.4  8.1  8.1       2.2
type4        
...

我是 R 的初学者,所以尝试这样做一直很有挑战性,尽管在我看来这很简单。我在缺失值 (NA) 中遇到错误,我将不胜感激任何想法,或对本网站上类似问题的指导。谢谢

首先,您可能想编写一个函数来计算三个连续值的斜率,如下所示:

slope  <-  function(x){
    if(all(is.na(x)))
        # if x is all missing, then lm will throw an error that we want to avoid
        return(NA)
    else
        return(coef(lm(I(1:3)~x))[2])
}

然后您可以使用 apply() 函数计算每一行的斜率 (MARGIN = 1),如下所示:

df <- read.csv(text = 
"Type,T0,T1,T2,t0,t1,t2
type1,0.2,0.3,0.4,0.3,0.2,0.1 
type2,1.4,2.5,3.4,1.5,0.5,3.4
type3,0.4,8.1,8.1,,2.2,")


df$slope1  <-  
    apply(df[,c('T0','T1','T2')],
          1,
          slope)

df$slope2  <-  
    apply(df[,c('t0','t1','t2')],
          1,
          slope)

然后计算平均斜率:

df$average.slope  <-  (df$slope1 + df$slope2)/2

您可以通过以下操作获得每一行的斜率:

#dat <- read.table(text="Type    T0   T1   T2   t0   t1   t2  
#type1  0.2  0.3  0.4  0.3  0.2  0.1 
#type2  1.4  2.5  3.4  1.5  0.5  3.4
#type3  0.4  8.1  8.1   NA  2.2   NA",header=TRUE)

tapply(
  dat[c("T0","T1","T2")],
  dat["Type"],
  FUN=function(x) 
    coef(lm(unlist(x) ~ seq_along(x)))[-1]
)

#Type
#type1 type2 type3 
# 0.10  1.00  3.85