使用 R 计算大型数据集中每一行的斜率
Calculating the slope of each row in a large data set using R
我有一大堆 data set
以下 format
:
第一列是 type
,subsequent columns
是 'type'
发生的不同时间。我想为 subset T0-T2
和 t0-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
我有一大堆 data set
以下 format
:
第一列是 type
,subsequent columns
是 'type'
发生的不同时间。我想为 subset T0-T2
和 t0-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