2014-08-27 2 views
2

Кажется, что нашел ошибку в тидыре.Как использовать tidyr для сбора таблицы данных, удалив столбцы с помощью строки имен столбцов?

У меня есть кусок кода, как это

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 (...)]' –

+0

@BondedDust yep. Я обновил вопрос. код работает вне функции, но внутри он не работает. – xiaodai

+0

@KFB отправил (но потом удалил) то, что кажется здесь ответом - ваша функция не печатает какой-либо вывод, потому что вы его не просили. Например, в его нынешнем виде, если вы просто сделали 'print (a())', вы могли бы получить то, что вам нужно. Или добавьте еще одну строку, которая просто 'dt2' в конце вашей функции' a() '. – A5C1D2H2I1M1N2O1R2T1

ответ

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 
Смежные вопросы