我想把(链式) magrittr对象输送到循环中。我该怎么做?
我将使用虚拟操作/数据作为示例:
library(data.table)
library(magrittr)
# Dummy data modification
d <- mtcars %>%
setDT() %>%
.[, cylSQ := sqrt(cyl)] %>%
.[, carb3 := carb^3]
# Dummy loop
res <- list()
for(i in unique(d$gear)) {
res[[i]] <- d[gear == i] %>%
.[, lm(cylSQ ~ mpg + carb3 * wt)] %>%
.$fitted.values
}可以不创建对象d并直接将其输送到循环中吗?例如:
for(i in unique(.$gear)) {
res[[i]] <- .[gear == i] %>%
...
}编辑:我不想用data.table或dplyr代替循环,只是好奇管道。
发布于 2016-08-26 13:30:30
这是一个粗略的工作,但您可以在magrittr包%$%中使用公开操作符。
即:
mtcars %>%
filter(hp > 1) %$%
for(i in 1:ncol(.)) {
print(.[1,i])
}
[1] 21
[1] 6
[1] 160
[1] 110
[1] 3.9
[1] 2.62
[1] 16.46
[1] 0
[1] 1
[1] 4
[1] 4发布于 2016-08-26 13:38:17
您不介意在这里使用dplyr而不是data.table吗?如果没有,请尝试如下:
library(dplyr)
d <- mtcars %>%
mutate(cylSQ = sqrt(cyl), carb3 = carb^3) %>%
group_by(gear) %>%
do(fitted.values = lm(cylSQ ~ mpg + carb3 * wt, data = .)[["fitted.values"]])发布于 2016-08-26 13:32:45
我不是magrittr的实践者,所以它可能会得到改进,但至少是有效的,而且应该是有效的。
as.data.table(mtcars
)[, cylSQ := sqrt(cyl)
][, carb3 := carb^3
][, lm(cylSQ ~ mpg + carb3 * wt)$fitted.values, by=gear
] %>%
split(by = "gear", keep.by = FALSE) %>%
lapply(unlist) %>%
lapply(unname) -> res由于新的split.data.table在1.9.7中需要data.table,有关如何在各种平台上安装的详细信息,请参阅安装wiki。
https://stackoverflow.com/questions/39167033
复制相似问题