【问题标题】:Passing variables through dplyr通过 dplyr 传递变量
【发布时间】:2015-09-18 15:22:33
【问题描述】:

我已经能够使用 .dots 和 _ 变量将参数传递给dplyr。但是,这种方法在这里似乎不起作用。我已经搜索了其他类似的问题,但我还没有找到一个可靠的解决方案。

工作示例

library(tidyr)
library(dplyr)

mtcars$brand<-row.names(mtcars)
mtcars_new<-mtcars %>%
   mutate(brand = strsplit(brand," ")) 

mtcars_new$brand<-sapply(mtcars_new$brand, "[", 1)

尝试传入变量 -- 失败

 target<-names(mtcars)[length(mtcars)]
 mtcars_new<-mtcars %>%
     mutate(target = strsplit(target," ")) 

 mtcars_new[length(mtcars)]<-sapply(mtcars_new[length(mtcars)], "[", 1)

感谢您的宝贵时间!

【问题讨论】:

  • 等等,你在哪里使用 tidyr?
  • 在我使用的函数中,根据变异的结果,我使用 unnest() 逐行转换结果
  • 我还是不明白这与这里的问题有什么关系。
  • 不使用 sapply,使用 unnest() 会导致错误。我相信 unnest 只是在 tidyr 而不是 dplyr? unnest 将在第一个示例中起作用,但在第二个示例中不起作用——如果我不清楚,我深表歉意。从我调试 unnest 的时间来看,它在参数/变量传递给它的方式上似乎与 dplyr 不同......这不是真的吗?
  • @akrun 成功了,谢谢!如果我的问题只是与 dplyr 相关,我深表歉意。我试图进一步编辑我的问题以避免混淆

标签: r dplyr


【解决方案1】:

我们可以使用library(lazyeval) 中的interp 来传递变量。代替返回liststrsplit,我们可以使用sub删除从第一个空格开始到字符串末尾的子字符串,删除“品牌”列并用@更改列名987654326@.

library(lazyeval)
library(dplyr)
mtcars %>%
    mutate_(v1=interp(~sub('\\s+.*$', '', v), v=as.name(target))) %>% 
    select_(.dots=setdiff(c(names(mtcars), 'v1'), target)) %>%
    setNames(., c(head(names(mtcars),-1), target))

【讨论】:

    猜你喜欢
    • 2017-06-08
    • 2018-10-11
    • 2011-10-19
    • 2014-12-25
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多