dcast изменяет содержимое фрейма данных
Я попытался с помощью пакета reshape изменить форму полученного кадра данных, но при его использовании меняются числа в кадре, чего не должно быть.
Фрейм данных содержит несколько переменных, а также несколько раз, когда эти переменные были измерены, для каждого человека есть 6 строк, то есть в 6 раз больше, чем было измерено. Теперь я хочу изменить структуру данных, чтобы для каждого человека была только одна строка вместо 6, что означает, что каждая переменная должна быть там 6 раз (по одному разу для каждого измерения), это легко сделать с помощью следующего кода:
melteddata <- melt(daten, id=(c("IDParticipant", "looporder")))
datenrestrukturiert <- dcast(melteddata, IDParticipant~looporder+variable)
с "daten", являющимся исходным кадром данных, "looporder" является переменной, которая отражает время измерения (1-6), вот пример (к сожалению, я не мог понять, как разместить таблицы):
https://www.dropbox.com/s/8c9dm4rttedbzw1/daten.jpg?dl=0
а может это нормально
structure(list(IDParticipant = c(1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 3L, 3L, 3L), looporder = c(1L, 2L, 3L, 5L, 6L, 2L, 3L,
5L, 6L, 1L, 2L, 3L), pc_mean_1 = c(NA, 3.22222222222222, NA,
3.22222222222222, 3.22222222222222, 3.66666666666667, 3.66666666666667,
3.66666666666667, 3.66666666666667, 3.25, NA, 3.25), bd_mean_1 = c(NA,
2.88888888888889, NA, 2.88888888888889, 2.88888888888889, 2.75,
2.75, 2.75, 2.75, 4.08333333333333, NA, 4.08333333333333), sm = c(999,
4, 999, 3.66666666666667, 1, 4, 4, 5, 5, 5, 999, 5), cm = c(999,
1.33333333333333, 999, 2.33333333333333, 1, 2, 2, 2.33333333333333,
1, 3, 999, 1.66666666666667)), .Names = c("IDParticipant", "looporder",
"pc_mean_1", "bd_mean_1", "sm", "cm"), row.names = c(NA, 12L), class = "data.frame")
datenrestrukturiert выглядит следующим образом:
https://www.dropbox.com/s/al93lnj76y1j266/datenrestrukturiert.jpg?dl=0
Я не хочу агрегировать или что-то еще, поэтому я попытался добавить fun.aggregate = NULL
без каких-либо изменений, также всегда есть следующее сообщение:
"Функция агрегации отсутствует: по умолчанию длина"
до сих пор все работало, но есть одна проблема: при использовании dcast (так же как и приведения) некоторые числа из переменных меняются, в основном на "0" или "1", но обычно должны быть некоторые другие числа, такие как "3.44" или "4.77" или что-то в этом роде, но в большинстве случаев они изменяются на "0".
У кого-нибудь есть намеки, почему это может быть?
Еще немного информации, которая может помочь: когда я импортирую набор данных через read.csv2, я всегда получаю странное имя для первой переменной, то есть на несколько символов перед именем переменной, чем показано в Excel: "İ..IDParticipant", который я переименуйте в "IDParticipant", это может иметь какое-либо отношение к этому?
Еще один побочный эффект: запуск с предоставленным мною образцом, все в порядке, исходный кадр данных состоит из 1404 строк и 353 переменных, может ли он быть слишком большим для R?
2 ответа
Если у вас есть дублированные комбинации ваших переменных LHS и RHS, то вам необходимо (1) создать вторичный уровень идентификаторов или (2) выполнить некоторую форму агрегации.
Вы можете проверить наличие дубликатов, используя any(duplicated(...))
,
Вот пример, используя ваш существующий образец "daten" (который не содержит дубликатов):
library(reshape2)
idvars <- c("IDParticipant", "looporder")
any(duplicated(daten[idvars]))
# [1] FALSE
melteddata <- melt(daten, id=idvars)
datenrestrukturiert <- dcast(melteddata, IDParticipant ~ looporder + variable)
datenrestrukturiert
# IDParticipant 1_pc_mean_1 1_bd_mean_1 1_sm 1_cm 2_pc_mean_1 2_bd_mean_1 2_sm 2_cm 3_pc_mean_1
# 1 1 NA NA 999 999 3.222222 2.888889 4 1.333333 NA
# 2 2 NA NA NA NA 3.666667 2.750000 4 2.000000 3.666667
# 3 3 3.25 4.083333 5 3 NA NA 999 999.000000 3.250000
# 3_bd_mean_1 3_sm 3_cm 5_pc_mean_1 5_bd_mean_1 5_sm 5_cm 6_pc_mean_1 6_bd_mean_1 6_sm
# 1 NA 999 999.000000 3.222222 2.888889 3.666667 2.333333 3.222222 2.888889 1
# 2 2.750000 4 2.000000 3.666667 2.750000 5.000000 2.333333 3.666667 2.750000 5
# 3 4.083333 5 1.666667 NA NA NA NA NA NA NA
# 6_cm
# 1 1
# 2 1
# 3 NA
Тем не менее, так как any(duplicated(...))
дает вам TRUE
вы, вероятно, будете иметь что-то более похожее на:
daten2 <- rbind(daten, daten[c(1, 4, 6), ])
any(duplicated(daten2[idvars]))
# [1] TRUE
В этом случае вы можете рассмотреть возможность использования getanID
из моего пакета "splitstackshape", чтобы удобно добавить вторичный "id" в ваш набор данных.
library(splitstackshape)
melteddata2 <- melt(getanID(daten2, idvars), c(".id", idvars))
datenrestrukturiert2 <- dcast.data.table(
melteddata2, .id + IDParticipant ~ looporder + variable)
datenrestrukturiert2
# .id IDParticipant 1_pc_mean_1 1_bd_mean_1 1_sm 1_cm 2_pc_mean_1 2_bd_mean_1 2_sm
# 1: 1 1 NA NA 999 999 3.222222 2.888889 4
# 2: 1 2 NA NA NA NA 3.666667 2.750000 4
# 3: 1 3 3.25 4.083333 5 3 NA NA 999
# 4: 2 1 NA NA 999 999 NA NA NA
# 5: 2 2 NA NA NA NA 3.666667 2.750000 4
# 2_cm 3_pc_mean_1 3_bd_mean_1 3_sm 3_cm 5_pc_mean_1 5_bd_mean_1 5_sm
# 1: 1.333333 NA NA 999 999.000000 3.222222 2.888889 3.666667
# 2: 2.000000 3.666667 2.750000 4 2.000000 3.666667 2.750000 5.000000
# 3: 999.000000 3.250000 4.083333 5 1.666667 NA NA NA
# 4: NA NA NA NA NA 3.222222 2.888889 3.666667
# 5: 2.000000 NA NA NA NA NA NA NA
# 5_cm 6_pc_mean_1 6_bd_mean_1 6_sm 6_cm
# 1: 2.333333 3.222222 2.888889 1 1
# 2: 2.333333 3.666667 2.750000 5 1
# 3: NA NA NA NA NA
# 4: 2.333333 NA NA NA NA
# 5: NA NA NA NA NA
Вот мое решение, основанное на предложениях Ананды (большое спасибо за это)
dataframe это "daten", содержащий много переменных, например, "IDParticipant", "looporder" и "sm"
сначала нам нужно создать объект, содержащий переменные для последующего использования функции melt и cast
idvars <- c ("IDParticipant", "looporder")
как оказалось, в фрейме данных были дубликаты с одинаковыми значениями в двух переменных: "IDParticipant" и "looporder", поэтому нам нужно добавить еще один id-varaible к фрейму данных при его плавлении, то есть с помощью "getanID"из пакета splitstackshape
melteddata <- melt (getanID (daten, idvars), c (". id", idvars))
добавив дополнительную переменную id, мы можем, наконец, привести необходимый нам фрейм данных, используя дополнительную переменную id и другие переменные.
datenrestrukturiert <- dcast (melteddata,.id + IDParticipant ~ переменная + looporder)