鉴于两个列表具有相同的键,您是否可以在不使用循环的情况下将回归系数放入第三个列表中,并且希望也不会为每个列表项创建临时数据框?
我熟悉lapply
,但不知道如何应用此案例,如果可能的话!
s = list()
s$x = list(a=c(1, 2, 3), b=c(4, 5, 6))
s$y = list(a=c(1, 2, 4), b=c(4, 5, 8))
for(i in names(s$x)) {
df = data.frame(x = s$x[[i]], y = s$y[[i]])
model = lm(y ~ x, df)
s$co[[i]] = model$coefficients
}
答案 0 :(得分:4)
async
答案 1 :(得分:4)
将指示的匿名函数映射到x和y上,提取系数并将其连接到输入s。没有包使用。
s_out <- c(s, co = list(Map(function(x, y) coef(lm(y ~ x)), s$x, s$y)))
,并提供:
> str(s_out)
List of 3
$ x :List of 2
..$ a: num [1:3] 1 2 3
..$ b: num [1:3] 4 5 6
$ y :List of 2
..$ a: num [1:3] 1 2 4
..$ b: num [1:3] 4 5 8
$ co:List of 2
..$ a: Named num [1:2] -0.667 1.5
.. ..- attr(*, "names")= chr [1:2] "(Intercept)" "x"
..$ b: Named num [1:2] -4.33 2
.. ..- attr(*, "names")= chr [1:2] "(Intercept)" "x"
答案 2 :(得分:2)
也许这会很有用
library(reshape2)
library(data.table)
setDT(melt(s))[, coef(lm(value[L1=="y"]~value[L1=="x"])) , L2]
或使用tidyverse
library(tidyverse)
s %>%
transpose %>%
map(~coef(lm(.[["y"]] ~ .[["x"]]))) %>%
c(s, co = .)
答案 3 :(得分:1)
或者,使用lapply()
和base r
。
s = list()
s$x = list(a=c(1, 2, 3), b=c(4, 5, 6))
s$y = list(a=c(1, 2, 4), b=c(4, 5, 8))
coeff.list <- lapply(names(s$x), (function(i){
df = data.frame(x = s$x[[i]], y = s$y[[i]])
model = lm(y ~ x, df)
model$coefficients
}))
names(coeff.list) <- names(s$x)
coeff.list