我(我认为应该是)R中的一个直接问题,似乎无法让它发挥作用。希望你能帮忙。
我有一个数据框,例如:
x y z
1 2 a
2 3 a
3 4 a
4 5 b
5 6 b
6 7 b etc...
我为每个z值子集(例如a,b ...)拟合线性模型(y~x)并提取梯度。
当我使用with语句选择'a'时,它会起作用:
coef(with(subset(data.frame, z == "a"), {lm(y ~ x)
}))[2]
但我的问题是我在Z列中有超过1000个唯一值。所以我试图设置一个循环(我知道R用户讨厌循环!)依次为z的每个值执行此操作并将结果返回到数据框中。代码是:
gradient.lm = NULL
unique.z <- as.matrix((unique(data.frame$z)))
count.z <- nrow(unique.z)
for (i in 1:count.z) {
gradient.lm[i] = coef((with(subset(data.frame, z == [i]), {lm(y ~ z)
})))[2]
}
但这不起作用,并给我错误代码:
> for (i in 1:count.z) {
+ activity.lm[i] = coef((with(subset(data.frame, z == [i]), {lm(y ~ x)
Error: unexpected '[' in:
"for (i in 1:count.z) {
activity.lm[i] = coef((with(subset(data.frame, z == ["
> })))[2]
Error: unexpected '}' in " }"
> }
Error: unexpected '}' in "}"
我的猜测是它没有意识到with函数中有[i]。
我无法找到一种方法来完成这项工作,或者想出另一种方法。如果您有任何建议,我们将非常感激。
答案 0 :(得分:1)
在base-R中,为您提供一个只有您显然感兴趣的渐变的命名向量:
gradient.lm <- unlist(lapply(split(df,df$z),function(chunk){
return(coef(lm(y~x, data=chunk))[[2]])
}))