将 lm 应用到由帧的第三列定义的数据帧的子集
我有一个数据框,其中包含 x 值向量、y 值向量和 ID 向量:
x <- rep(0:3, 3)
y <- runif(12)
ID <- c(rep("a", 4), rep("b", 4), rep("c", 4))
df <- data.frame(ID=ID, x=x, y=y)
我想为共享相同 ID 的 x 和 y 子集创建一个单独的 lm。以下代码可以完成工作:
a.lm <- lm(x~y, data=subset(df, ID=="a"))
b.lm <- lm(x~y, data=subset(df, ID=="b"))
c.lm <- lm(x~y, data=subset(df, ID=="c"))
除了这非常脆弱(未来的数据集可能有不同的 ID)并且未矢量化。我还想将所有流媒体存储在一个数据结构中。一定有一种优雅的方法可以做到这一点,但我找不到。有什么帮助吗?
I've got a data frame containing a vector of x values, a vector of y values, and a vector of IDs:
x <- rep(0:3, 3)
y <- runif(12)
ID <- c(rep("a", 4), rep("b", 4), rep("c", 4))
df <- data.frame(ID=ID, x=x, y=y)
I'd like to create a separate lm for the subset of x's and y's sharing the same ID. The following code gets the job done:
a.lm <- lm(x~y, data=subset(df, ID=="a"))
b.lm <- lm(x~y, data=subset(df, ID=="b"))
c.lm <- lm(x~y, data=subset(df, ID=="c"))
Except that this is very brittle (future data sets might have different IDs) and un-vectorized. I'd also like to store all the lms in a single data structure. There must be an elegant way to do this, but I can't find it. Any help?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用
base
函数,您可以split
原始数据帧并对其使用lapply
:Using
base
functions, you cansplit
your original dataframe and uselapply
on that:怎么样
?
How about
?
使用
plyr
包中的一些魔法。函数dlply
接受一个data.frame
,将其拆分,对每个元素应用一个函数,然后将其组合到一个list
中。这非常适合您的应用。这将创建一个列表,其中包含 ID 的每个子集的模型:
这意味着您可以对列表进行子集化并使用它。例如,要获取
lm
模型的系数,其中ID=="a"
:Use some of the magic in the
plyr
package. The functiondlply
takes adata.frame
, splits it, applies a function to each element, and combines it into alist
. This is perfect for your application.This creates a list with a model for each subset of ID:
This means you can subset the list and work with that. For example, to get the coefficients for your
lm
model whereID=="a"
: