Передача имени столбца в спред R tidyr

Я пытаюсь передать объект с именем столбца функции распространения, но вместо чтения значения внутри объекта он просто пытается использовать само имя объекта.

Вот просто игрушечный пример

library(tidyr)
d = (1:4)
n = c("a"," a", "b","b") 
s = c(1, 2,5,7) 

df = data.frame(d,n, s) 

Value <- n
data_wide <- spread(df, Value , s)

Ошибка: Ключевой столбец «Значение» не существует во входных данных.

в то время как ниже работает нормально:

data_wide <- spread(df, n, s)
d  a  a  b
1 1 NA  1 NA
2 2  2 NA NA
3 3 NA NA  5
4 4 NA NA  7

person user2963882    schedule 06.06.2016    source источник
comment
Было ли это пространство во 2-м месте преднамеренным? n = c("a"," a", "b","b")   -  person zx8754    schedule 06.06.2016


Ответы (3)


Мы можем использовать spread_() для передачи имен переменных в виде строк:

library(tidyr)
# dummy data
df1 <- data.frame(d = (1:4),
                  n = c("a", "a", "b", "b") ,
                  s = c(1, 2, 5, 7)) 

myKey <- "n"
myValue <- "s"
spread_(data = df1, key_col = myKey , value_col = myValue)
person zx8754    schedule 06.06.2016

Использование data.table

library(data.table)
 dcast(setDT(df), eval(as.name(myValue))~ eval(as.name(myKey)), value.var=myValue)

Что касается передачи имен в функциях tidyr, этот ответ также может помочь (который было опубликовано пару часов назад).

person akrun    schedule 06.06.2016

похоже, что теперь он tidyr распознается автоматически - это работает в обоих направлениях: введите имена столбцов или поместите их в строки

stocks <- data.frame(
    time = as.Date('2009-01-01') + 0:9,
    X = rnorm(10, 0, 1),
    Y = rnorm(10, 0, 2),
    Z = rnorm(10, 0, 4)
)
stocksm <- stocks %>% gather(stock, price, -time) # make it to skinny table

# make it wide table
stocksm %>% spread(stock, price)

# time          X           Y          Z
# 1  2009-01-01  0.7444343 -0.07030219  0.9140019
# 2  2009-01-02  1.1988507  2.98659296  5.3044361
# 3  2009-01-03 -0.4344259 -0.11526884 -3.8380602
# 4  2009-01-04  0.8154400  2.08313458 -0.1152524
# 5  2009-01-05  1.1965647 -0.59055846  3.5647410
# ...



# it's same if put column names in strings
stocksm %>% spread('stock', 'price')

# time          X           Y          Z
# 1  2009-01-01  0.7444343 -0.07030219  0.9140019
# 2  2009-01-02  1.1988507  2.98659296  5.3044361
# 3  2009-01-03 -0.4344259 -0.11526884 -3.8380602
# 4  2009-01-04  0.8154400  2.08313458 -0.1152524
# 5  2009-01-05  1.1965647 -0.59055846  3.5647410



# or put in string variables
col1 = 'stock'
col2 = 'price'
stocksm %>% spread(col1, col2)

# time          X           Y          Z
# 1  2009-01-01  0.7444343 -0.07030219  0.9140019
# 2  2009-01-02  1.1988507  2.98659296  5.3044361
# 3  2009-01-03 -0.4344259 -0.11526884 -3.8380602
# 4  2009-01-04  0.8154400  2.08313458 -0.1152524
# 5  2009-01-05  1.1965647 -0.59055846  3.5647410
person YJZ    schedule 27.07.2018