2016-11-16 39 views
8

给定一个数据帧和包含操作以在列执行字符串:řdplyr transmute_串输入错误

myDF <- as.data.frame(cbind(c(1,2,3,4),c(1,2,3,4),c(1,2,3,4))) 
myString <- 'Added = V1 + V2' 

调用“transmute_()”会给我所需的输出:

transmute_(myDF,myString) 

输出:

Added = V1 + V2 
1    2 
2    4 
3    6 
4    8 

太好了!但是,如果我立即重复相同的'transmute_()'函数,我会得到一个错误。

transmute_(myDF,myString) 
Error: invalid (do_set) left-hand side to assignment 

更改输入字符串的列名仍然给出相同的错误,并将相同的字符串存储在不同的变量中。但是,如果我更改新的列名称,它将首次再次运行,然后出现错误(请参阅下面的示例)。

我不确定这是为什么。它似乎是一个临时版本的输出存储在某处,错误是对此的反应,但我从来没有遇到过这样的事情。任何帮助理解它并绕过它(除了新列的明显重命名)将不胜感激。

谢谢!

myString <- 'Added = V1 + V3' 
transmute_(myDF,myString) 
Error: invalid (do_set) left-hand side to assignment 

myString2 <- 'Added = V1 + V3' 
transmute_(myDF,myString2) 
Error: invalid (do_set) left-hand side to assignment 

myString2 <- 'Added_2 = V1 + V3' 
transmute_(myDF,myString2) 
    Added_2 = V1 + V3 
1     2 
2     4 
3     6 
4     8 

回答

0

mutate_有同样的问题,但看代码,因为transmute_调用mutate_。这不是dplyr中的一个bug,但是在dplyr github页面上提出了这个问题。见github issue 315

运行transmute_(myDF,myString)后,您会看到Added在基础环境中可用。只需输入它(或base::Added),您将看到已创建的对象和值。当您再次调用您的代码行时,这会导致问题。

有关详细信息阅读罗曼·弗朗索瓦和哈德利韦翰

github issue 315评论
0

感谢您的响应@phiver!我现在发布这个作为替代答案,并将留下问题打开一段时间,看看是否有人有更好的解决方案... 它真的好像这是一个死路一条。鉴于Added的另一种方式是坐在基地是通过使用“pryr”包:

library(pryr) 
where(Added) 
<environment: base> 

不幸的是这似乎是基本不能被编辑:

rm('Added',inherits = TRUE) 
Error in rm('Added',inherits = TRUE) 
cannot remove bindings from a locked environment 

在这一点上我觉得这样做太复杂了。我的最终目标是对特定数量的coumns执行操作,其中列名可以因案例而异。使用字符串(因此transmute_()函数)似乎是最有意义的。然而,这里的另一种方法(从how can i tell select() in dplyr that the string it is seeing is a column name in a data frame想法):

colsOfInterest <- c('V1','V2') 
colPosInDF <- match(colsOfInterest , names(myDF)) 
reduced_myDF <- select(myDF,colPosInDF) 
desired_DF <- as.data.frame(rowSums(reduced_myDF)) 

不怎么样,但它的工作。如果有人有更清洁的解决方法,请随时分享!