2014-08-27 41 views
2

似乎在tidyr中發現了一個錯誤。如何使用tidyr通過使用列名稱的字符串刪除列來收集data.table?

我有這樣

rm(hello) 
a <- function() { 
    dt <- data.table(`*stat*` = c("mean","max"), time = c(11, 12), val1 = c(1,2), val2 =c(3,4)) 
    hello <- "^(time)$" 
    dt2 <- dt %>% gather(dimension, value, -matches("\\*stat\\*"), -matches(hello)) 
} 

a() 

dt <- data.table(`*stat*` = c("mean","max"), time = c(11, 12), val1 = c(1,2), val2 =c(3,4)) 
hello <- "^(time)$" 
dt2 <- dt %>% gather(dimension, value, -matches("\\*stat\\*"), -matches(hello)) 

作品的一段代碼。

唯一的區別是,一組代碼是在一個功能,但另一個不是!

+0

'var'是一個函數名。是否有可能用較少的多態字符串嘗試它可能會成功。 (無論如何,我的代碼都不會出現錯誤。)即使沒有錯誤,它也可以提供所需的結果。我會用'[,grepl(...)]' – 2014-08-28 00:17:01

+0

@BondedDust yep。我更新了問題。該代碼在函數外部工作,但在其內部不起作用。 – xiaodai 2014-08-28 03:23:46

+0

@KFB發佈(但後來刪除)這裏的答案似乎是 - 這個函數沒有打印任何輸出,因爲你沒有要求它。例如,以目前的形式,如果你只是簡單地'打印(a())',你就能夠得到你需要的東西。或者,在'a()'函數的末尾添加另一條只是'dt2'的行。 – A5C1D2H2I1M1N2O1R2T1 2015-01-09 04:07:06

回答

0

我只是增加一個答案這裏要說明的功能和獨立的代碼具有相同的效果,一旦dt2被添加到a()函數的最後一行(如@ A5C1D2H2I1M1N2O1R2T1的意見建議)。

library(tidyverse) 

a <- function() { 
    dt <- data.table::data.table(`*stat*` = c("mean","max"), time = c(11, 12), val1 = c(1,2), val2 =c(3,4)) 
    hello <- "^(time)$" 
    dt2 <- dt %>% gather(dimension, value, -matches("\\*stat\\*"), -matches(hello)) 
    dt2 
} 

a() 
#> *stat* time dimension value 
#> 1 mean 11  val1  1 
#> 2 max 12  val1  2 
#> 3 mean 11  val2  3 
#> 4 max 12  val2  4 

dt <- data.table::data.table(`*stat*` = c("mean","max"), time = c(11, 12), val1 = c(1,2), val2 =c(3,4)) 
hello <- "^(time)$" 
dt2 <- dt %>% gather(dimension, value, -matches("\\*stat\\*"), -matches(hello)) 
dt2 
#> *stat* time dimension value 
#> 1 mean 11  val1  1 
#> 2 max 12  val1  2 
#> 3 mean 11  val2  3 
#> 4 max 12  val2  4 

identical(a(), dt2) 
#> [1] TRUE 
相關問題