Может ли преобразование в базе R превратить более одного раза в один столбец в длинном формате? - PullRequest
0 голосов
/ 03 апреля 2020

Я могу изменить часть моих столбцов с одинаковыми именными именами opg.1 до opg.10, но когда я представляю последние две переменные времени, mkd.1 и mkd.2, я получаю следующее ошибка:

Fejl i reshapeLong(data, idvar = idvar, timevar = timevar, varying = varying,  : 
  'varying' arguments must be the same length

Короче говоря, мой вопрос, будет ли переименование mkd.1 и mkd.2 иметь одинаковое имя opg stem удалить ошибку, и если это произойдет, почему?

Мой код

gdata <- termin.test[sel.cols]
names(gdata) <- c(  "opg.1", "opg.2","opg.3","opg.4","opg.5", "opg.61",
                    "opg.62","opg.7","opg.8","opg.9","opg.10",
                    "navn",
                    "mkd.11","mkd.12"  )
head(gdata)
#   opg.1 opg.2 opg.3 opg.4 opg.5 opg.61 opg.62 opg.7 opg.8 opg.9 opg.10
# 1     2     2     0     0     1      0     10     4     5    10      3
# 2     0     1     0     0     2      2      5     5     2     8      1
# 3     1     0     0     0     0      0      7     3     3     7      4
# 4     0     0     0     0     0      2      7     4     8    10      7
# 5     8     2     3     4     7      3     11    12    10     8     16
# 6     1     2     1     1     2      2      5     2     2     3      6
#        navn mkd.11 mkd.12
# 1  Czzzzzzz      5     24
# 2  Xxxxxx A      2     16
# 3  Cccccc B      1     17
# 4 Christian      0     26
# 5 Emil Xxxx     16     33
# 6 Aaaaa-Sss      4     11

Пока все хорошо. Но здесь, мой varying= параметр отвергает меня. Я хотел переменные opg.1 - opg.10 и последние два mkd.11 и mkd.12.

redata <- reshape(
  # De første 11 kolonner er opgave-kryd-optællinger + nr 12: Elevens navn
  gdata, # [,1:12], 
  direction = "long",
  varying=c(1:11,13,14), # Works problem free with   varying = 1:11
  timevar = "opgave", # 
  # Vektor OPGAVER er defineret med opgavenavne ovenfor  ????
  times = opgaver
)

У меня есть гипотеза, что это будет работать, чтобы переименовать mkd.11 -> opg.11. Но я пишу вопрос, потому что я хотел бы (1) войти в базу R и (2) понять, что я делаю. Я посмотрел вопрос Какой код выполняет такая задача, как пакет reshape2, в базовой функции изменения формы? , но не нашел ни соответствующей проблемы, ни ответов, относящихся к моему вопросу.

Редактировать

Перефразируя вопрос, поскольку мне нужен один числовой столбец в длинном формате измененного фрейма данных.

Ответы [ 3 ]

1 голос
/ 03 апреля 2020

Я вижу, что когда я использую предложение @akrun, я получаю два столбца opg и mkd в измененном фрейме данных, и так как есть 11 opg -колонок и только 2 mkd - Причиной появления сообщения об обращении к менино является очевидная причина: в моем наборе данных я получаю

> melt(setDT(gdata), measure = patterns('^opg\\.\\d+$', '^mkd\\.\\d+$'),
+            value.name = c('opg', 'mkg'), variable.name = 'opgave')
#                  navn opgave opg mkg
#  1:          Czzzzzzz      1   2   5
#  2:    Caroline Cxxxx      1   0   2
#  3:    Crrrrrrr Rrrrr      1   1   1
#  4:         Christian      1   0   0
#  5:    Emil Zzzz Cccc      1   8  16
# ---                                                 
#238:            Owiler     11   8  NA
#239:              Sarah    11   5  NA
#240:          Bang Bang    11  10  NA
#241:             Thhhhh    11   2  NA
#242:          William B    11   6  NA

Значения NA в столбце mkg показывают, что переменных этого типа меньше. Это не так, как задумано. Поэтому я придерживаюсь опции с тем же именем:

gdata <- termin.test[sel.cols]
names(gdata) <- c(  "opg.1", "opg.2","opg.3","opg.4","opg.5", "opg.61",
                    "opg.62","opg.7","opg.8","opg.9","opg.10",
                    "navn",
                    "opg.11","opg.12"  )
redata <- reshape(
  # De første 11 kolonner er opgave-kryd-optællinger + nr 12: Elevens navn
  gdata, # [,1:12], 
  direction = "long",
  varying=c(1:11,13,14),   # De første 11 kolonner skal "vendes"
  timevar = "opgave", # 
  # Vektor OPGAVER er defineret med opgavenavne ovenfor  ????
  times = opgaver
)

Это решение работает в моей дальнейшей обработке на диаграмме, показанной ниже, с использованием geom_boxplot(), и я могу жить с именами двух последних столбцы или переименование их в факторизованную переменную opgave выходит за рамки этого вопроса. enter image description here

1 голос
/ 03 апреля 2020

Функция reshape нуждается в переменном аргументе, чтобы иметь сбалансированные и непротиворечивые имена. У opg 11 элементов, а у mkd только 2.

Мне нужен один числовой столбец в длинном формате измененного фрейма данных.

Затем переименуйте две переменные mkd в opg.11 и opg.12 перед изменением формы (как вы сделали).

names(gdata)[13:14] <- c("opg.11","opg.12")

reshape(gdata,
  direction = "long",
  varying=c(1:11,13,14),
  timevar = "opgave"  
  )  # we don't have your `opgaver` object

          navn opgave opg id
1.1   Czzzzzzz      1   2  1
2.1   Xxxxxx A      1   0  2
3.1   Cccccc B      1   1  3
4.1  Christian      1   0  4
5.1  Emil Xxxx      1   8  5
6.1  Aaaaa-Sss      1   1  6
...
1.12  Czzzzzzz     12  24  1
2.12  Xxxxxx A     12  16  2
3.12  Cccccc B     12  17  3
4.12 Christian     12  26  4
5.12 Emil Xxxx     12  33  5
6.12 Aaaaa-Sss     12  11  6

Если ваш вывод представляет собой блокпост, измените метки в команде, чтобы нарисовать его, или вы можете преобразовать переменную opgave в фактор с соответствующими метками.

1 голос
/ 03 апреля 2020

Если мы хотим переименовать 'mkd' в 'opg'

library(ggplot2)
library(stringr)
library(dplyr)
library(tidyr)
gdata %>% 
    rename_at(vars(starts_with('mkd')), ~ str_replace(., 'mkd', 'opg')) %>%
    pivot_longer(cols = -navn, names_to = 'opgave', values_to = 'value') %>%
    ggplot(aes(x =opgave, y = value)) +
       geom_boxplot()

enter image description here

data

gdata <- structure(list(opg.1 = c(2L, 0L, 1L, 0L, 8L, 1L), opg.2 = c(2L, 
1L, 0L, 0L, 2L, 2L), opg.3 = c(0L, 0L, 0L, 0L, 3L, 1L), opg.4 = c(0L, 
0L, 0L, 0L, 4L, 1L), opg.5 = c(1L, 2L, 0L, 0L, 7L, 2L), opg.61 = c(0L, 
2L, 0L, 2L, 3L, 2L), opg.62 = c(10L, 5L, 7L, 7L, 11L, 5L), opg.7 = c(4L, 
5L, 3L, 4L, 12L, 2L), opg.8 = c(5L, 2L, 3L, 8L, 10L, 2L), opg.9 = c(10L, 
8L, 7L, 10L, 8L, 3L), opg.10 = c(3L, 1L, 4L, 7L, 16L, 6L), navn = c("Czzzzzzz", 
"Xxxxxx A", "Cccccc B", "Christian", "Emil Xxxx", "Aaaaa-Sss"
), mkd.11 = c(5L, 2L, 1L, 0L, 16L, 4L), mkd.12 = c(24L, 16L, 
17L, 26L, 33L, 11L)), class = "data.frame", row.names = c(NA, 
-6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...