2016-03-09 4 views
2

Это то, над чем я работал некоторое время, просто создавая отдельные кадры данных и делая full_join, но я думаю, что есть более простой способ.R: Транспонирование из длинной в широкую и агрегирующую строки с совпадением ID

В целом, я хочу рассчитать разницу между значением индивидуального идентификатора от времени 1 до времени 2 по типу из кадра данных длинной формы. Это один из способов, по-моему, я мог бы это сделать, но если у других людей есть другие методы или идеи, я тоже хотел бы их услышать.

Однако я также хотел бы знать, как решить эту проблему переноса, так как мне любопытно.

Вот моя проблема.

У меня есть кадр данных в длинной форме с 5 различными измерениями для двух разных периодов времени. Я хочу преобразовать этот фрейм данных из длинной формы в широкую форму, чтобы вместо этого иметь вид DF (обратите внимание, что не все типы включены - только 2 для длины):

(пример df1)

ID Time Value Type 
1  1  7  Type1 
1  2  8  Type1 
2  1  9  Type1 
2  2  10 Type1 
1  1  13 Type2 
1  2  15 Type2 
2  1  17 Type2 
2  2  19 Type2 

Я хочу, чтобы выглядеть следующим образом:

(пример DF 2)

ID Type1.1 Type1.2 Type2.1 Type2.2 
1  7   8   13  15 
2  9   10   17  19 

Я использую:

library(dplyr) 
library(tidyr) 
df.new <- df %>% 
spread(Type, Measurement.Value) 

и получить это из примера ф.р. 1, которая находится на правильном пути:

(пример ДФ 3)

ID Time Type1 Type2 
1  1  7  13 
1  2  8  15 
2  1  9  17 
2  2  10  19 

Но теперь я хочу, чтобы распространить время для каждого типа. Когда я делаю что-то вроде этого на примере DF3:

newer.df <- df.new %>% 
spread(Time, Type1) 

сделать это:

ID Type1.1 Type1.2 
1  7   NA 
1  NA   8 
2  9   NA 
2  NA   10 

Таким образом, он производит ЧА для каждой строки - есть способ, которым я могу свернуть строки по каждому другой по ID? Кажется, я что-то упускаю.

Помните, что в моем примере кода я использую только 2 типа, но на самом деле у меня есть 5 типов - просто хотел дать упрощенный код.

ответ

2

Мы можем использовать dcast() от reshape2.

library(reshape2) 
dcast(df, ID ~ Type + Time, value.var = "Value") 
# ID Type1_1 Type1_2 Type2_1 Type2_2 
#1 1  7  8  13  15 
#2 2  9  10  17  19 
+0

Это сработало! Большое спасибо. Я попытался использовать пакет 'reshape', используя' cast() ', но получал ту же проблему. Я рад видеть, что у 'reshape2' было мое решение. – Pete

1

Или используя оригинальный tidyr пакет, мы могли бы сделать это:

library(tidyr) 
df$Type <- paste(df$Type, df$Time, sep="_") 
df$Time <- NULL 
spread(df, key=Type, value=Value) 
ID Type1_1 Type1_2 Type2_1 Type2_2 
    1  7  8  13  15 
    2  9  10  17  19 

Обнуление столбец время сделал трюк для меня. Кажется, что spread считает, что все столбцы не используются иначе, как dcast будет звонить id.vars. Однако может быть более элегантное решение, использующее tidyr.

+0

Это решение также работало. Спасибо! Да, я подозреваю, что есть что-то более элегантное, чем преобразовать такие переменные. Так или иначе, это сработало так, спасибо. – Pete