2016-11-03 1 views
1

я есть таблица данных, которая содержит три переменные:добавить еще несколько столбцов на основе значения в других столбцах R

  1. часов: формат INT, значение в диапазоне [0,23], и она увеличивается
  2. мин: формат INT, значение (10,20,30,40,50,60), она также увеличивается
  3. х: формат INT

ниже простой образец:

stocks <- data.frame(
hours = c(0,0,0,0,0,0), 
mins = c(10,10,10,20,20,30), 
x = c(2,4,4,5,3,4) 
) 

выход:

на основе этой таблицы, я хочу добавить еще несколько столбцов в соответствии с ч и мин. это выглядит так, как показано ниже:

0_10 0_20 0_30 
    2 5 4 
    4 3  
    4   

Я пытался использовать dcast функцию, но финальный стол просто вычислить частоту X :(

library(data.table) 
dcast(setDT(stocks), x ~ hours+mins, value.var = c("x")) 
#Aggregate function missing, defaulting to 'length' 
    x 0_10 0_20 0_30 
1: 2 1 0 0 
2: 3 0 1 0 
3: 4 2 0 1 
4: 5 0 1 0 

любое предложение

благодарности? !

+0

Try 'LST <- поместить значение (акции, х ~ ч + mins); data.frame (lapply (lst, 'length <-', max (lengths (lst)))) ' – akrun

ответ

2

Нам нужно изменить формулу в dcast

library(data.table)#1.9.7+ 
dcast(setDT(stocks), rowid(hours, mins)~hours+mins, value.var = "x")[, hours := NULL][] 
# 0_10 0_20 0_30 
#1: 2 5 4 
#2: 4 3 NA 
#3: 4 NA NA 

С версии 1.9.7 <, мы создаем переменную последовательности, сгруппированные по 'Часы', 'мин', а затем сделать dcast

setDT(stocks)[, Seq := 1:.N, by = .(hours, mins)] 
dcast(stocks, Seq~hours + mins, value.var = "x")[, Seq := NULL][] 
+0

Привет, спасибо за идею, но после запуска кода u, он сказал, что нет функции rowid :( – ZAWD

+0

@ZAWD Он находится в девеловом варианте 'data.table' ie 1.9.7 – akrun

+1

@Frank Спасибо, я обновил сообщение – akrun