2014-10-17 49 views
3

我將tidyr與閃亮一起使用,因此需要在tidyr操作中使用動態值。 但是我確實遇到了使用gather_()的麻煩,我認爲這是爲這種情況設計的。下面 小例子:如何在變量中使用gather_ in tidyr

library(tidyr) 

df <- data.frame(name=letters[1:5],v1=1:5,v2=10:14,v3=7:11,stringsAsFactors=FALSE) 
#works fine 
df %>% gather(Measure,Qty,v1:v3) 

dyn_1 <- 'Measure' 
dyn_2 <- 'Qty' 
dyn_err <- 'v1:v3' 
dyn_err_1 <- 'v1' 
dyn_err_2 <- 'v2' 
#error 
df %>% gather_(dyn_1,dyn_2,dyn_err) 
#error 
df %>% gather_(dyn_1,dyn_2,dyn_err_1:dyn_err_2) 

經過一番調試,我意識到在熔體measure.vars部分發生錯誤,但我不知道如何得到它的工作「:」有...... 請幫助有一個解決方案並解釋一點,所以我可以瞭解更多。

回答

3

您正在告訴gather_尋找不在單獨的列ID上的colore 'v1:v3'。只需將dyn_err <- "v1:v3"更改爲dyn_err <- paste("v", seq(3), sep="")即可。

如果您的df具有不同的列名稱(例如var_a,qtr_b,stg_c),則可以提取這些列名稱或使用paste函數作爲感興趣的變量。

dyn_err <- colnames(df)[2:4] 

dyn_err <- paste(c("var", "qtr", "stg"), letters[1:3], sep="_") 

你需要看看你想要的列名,並作出相應的載體。

+1

嗨,再次感謝您的幫助。如果列不是v1:v3,但是有一些隨機名稱,如'var_a','qtr_b','length_c'?他們是有序的,但我想var_a通過length_c – 2014-10-17 18:29:18

+0

@XiushiLe,做上面的編輯有助於澄清你怎麼能做到這一點幾乎任何列名? – cdeterman 2014-10-17 19:01:30

+0

是的,它有幫助。我想我並不清楚':'是如何在R中表示的。我之前的解釋是從startcol到endcol,r會通過查看名稱(df)自動填寫剩下的部分。我試圖讓用戶輸入起始列,並且應該轉換起始列和最後一列之間的任何列。我認爲dyn_err < - colnames(df)[2:4]對我來說足夠好。 – 2014-10-17 19:19:03