2016-11-16 41 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)) 

不怎麼樣,但它的工作。如果有人有更清潔的解決方法,請隨時分享!