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)

Другие вопросы по тегам