2016-02-03 1 views
3

У меня есть dataframe в R с 2186 общ 38 балов. Строки имеют переменный ID со ссылкой на уникальные эксперименты и с использованиемСлияние строк с одинаковой переменной ID

length(unique(df$ID))==nrow(df) 

n_occur<-data.frame(table(df$ID)) 

Я знаю 327 из моих строк повторили идентификаторы с некоторыми идентификаторами повторяются несколько раз. Я пытаюсь объединить строки с тем же идентификатором, что и не дубликаты, а только второе, третье и т. Д. Наблюдения в рамках данного эксперимента.

Так, например, если бы я был

x y ID 
1 2 a 
1 3 b 
2 4 c 
1 3 d 
1 4 a 
3 2 b 
2 3 a 

Я хотел бы закончить с

x y ID x2 y2 ID2 x3 y3 ID3 
1 2 a 1 4 a 2 3 a 
1 3 b 3 2 b na na na 
2 4 c na na na na na na 
1 3 d na na na na na na 

Я видел аналогичные вопросы для SQL и PHP, но это не помогло мне с моим попытки в R. Любая помощь была бы с благодарностью оценена.

+0

Я думаю, вы можете использовать функцию слияния для этого. –

+1

Также смотрите [здесь] (http://stackoverflow.com/questions/11608167/cast-multiple-value-columns) или [здесь] (http://stackoverflow.com/questions/26019915/how-to-pread -или-cast-multiple-values-in-r) – akrun

+0

@akrun Я снова открылся, потому что оригинал не был хорошим imo. Вторая ссылка, которую вы предоставили, намного лучше. Отмечено снова как дубликат. – Jaap

ответ

4

Вы можете использовать расширенную функцию dcast из таблицы данных .table, где вы можете выбрать несколько переменных значений. С setDT(mydf) конвертирования dataframe к DataTable и с [, idx := 1:.N, by = ID] добавить индекс по ID который вы используете впоследствии в dcast формулы:

library(data.table) 
dcast(setDT(mydf)[, idx := 1:.N, by = ID], ID ~ idx, value.var = c("x","y")) 

Или с development version of data.table (v1.9.7+), вы можете использовать новую rowid функции:

dcast(setDT(mydf), ID ~ rowid(ID), value.var = c("x","y")) 

дает:

ID x_1 x_2 x_3 y_1 y_2 y_3 
1: a 1 1 2 2 4 3 
2: b 1 3 NA 3 2 NA 
3: c 2 NA NA 4 NA NA 
4: d 1 NA NA 3 NA NA 

Используемые данные:

mydf <- structure(list(x = c(1L, 1L, 2L, 1L, 1L, 3L, 2L), y = c(2L, 3L, 
4L, 3L, 4L, 2L, 3L), ID = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 
1L), .Label = c("a", "b", "c", "d"), class = "factor")), .Names = c("x", 
"y", "ID"), class = "data.frame", row.names = c(NA, -7L)) 
+0

Спасибо за ответ, извините, это был дубликат! – suuz

Смежные вопросы