Хорошо, это похоже на то, что вы хотите. От чтения файла справки, это кажется, что это должен делать то, что вы хотите:
reshape(df, idvar = c("c1", "c2"), timevar = c("gr", "subgr")
, direction = "wide")
c1 c2 val.c(1, 2, 1, 2) val.c(1, 1, 2, 2)
1 1 1 NA NA
5 1 2 NA NA
9 2 1 NA NA
13 2 2 NA NA
Я не могу полностью объяснить, почему он показывает со значениями NA. Однако, может быть, это немного со страницы справки объясняет:
timevar
the variable in long format that differentiates multiple records from the same
group or individual. If more than one record matches, the first will be taken.
я сначала принял это означает, что R будет использовать это частичные возможности сопоставления, если существует неопределенность в именах столбцов вы дали, но, может быть, нет? Затем я попытался комбинируя gr
и subgr
в одну колонку:
df$newcol <- with(df, paste("gr.", gr, "subgr.", subgr, sep = ""))
И давайте попробуем это снова:
reshape(df, idvar = c("c1", "c2"), timevar = "newcol"
, direction = "wide", drop= c("gr","subgr"))
c1 c2 val.gr.1subgr.1 val.gr.2subgr.1 val.gr.1subgr.2 val.gr.2subgr.2
1 1 1 1 2 3 4
5 1 2 5 6 7 8
9 2 1 9 10 11 12
13 2 2 13 14 15 16
Presto! Я не могу объяснить или понять, как сделать это не append val.
именам столбцов, но я оставлю вас понять это самостоятельно. Я уверен, что это где-то на странице справки. Он также поставил группы в другом порядке, чем вы просили, но данные кажутся правильными.
FWIW, вот решение с reshape2
> dcast(c1 + c2 ~ gr + subgr, data = df, value.var = "val")
c1 c2 1_1 1_2 2_1 2_2
1 1 1 1 3 2 4
2 1 2 5 7 6 8
3 2 1 9 11 10 12
4 2 2 13 15 14 16
Хотя вы все еще должны очистить имена столбцов.
всегда есть базовая функция 'reshape', я никогда не был достаточно умен, чтобы понять аргументы к нему, но я также не обжора для боли, поэтому я обычно использую 'reshape2' для его согласованности и простоты использования. YMMV – Chase
reshape и reshape2 записаны в базе R, поэтому, если вы хотите использовать их подход, не загружая пакет, просто извлеките содержимое функции (например, введите acast и скопируйте содержимое функции) –
Почему избежать пакетов? –