首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化R链(magrittr)

优化R链(magrittr)
EN

Stack Overflow用户
提问于 2016-08-26 13:04:27
回答 3查看 362关注 0票数 1

我想把(链式) magrittr对象输送到循环中。我该怎么做?

我将使用虚拟操作/数据作为示例:

代码语言:javascript
复制
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并直接将其输送到循环中吗?例如:

代码语言:javascript
复制
for(i in unique(.$gear)) {
    res[[i]] <- .[gear == i] %>%
    ...
}

编辑:我不想用data.tabledplyr代替循环,只是好奇管道。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-26 13:30:30

这是一个粗略的工作,但您可以在magrittr%$%中使用公开操作符。

即:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2016-08-26 13:38:17

您不介意在这里使用dplyr而不是data.table吗?如果没有,请尝试如下:

代码语言:javascript
复制
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"]])
票数 3
EN

Stack Overflow用户

发布于 2016-08-26 13:32:45

我不是magrittr的实践者,所以它可能会得到改进,但至少是有效的,而且应该是有效的。

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39167033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档