Как изменить форму таблицы данных после применения нескольких функций к нескольким переменным?

У меня есть следующие образцы данных:

     Hostname           Date-Time hdisk86 hdisk88 hdisk90 hdisk89 hdisk91 hdisk92 hdisk93 hdisk94 hdisk96 hdisk95
1: hostname1  2015-01-26 00:15:22       0       0       0       0       0       0       0       0       0       0
2: hostname1  2015-01-26 00:30:24       0       0       0       0       0       0       0       0       0       0
3: hostname1  2015-01-26 00:45:25       0       0       0       0       0       0       0       0       0       0
4: hostname1  2015-01-26 01:00:25       0       0       0       0       0       0       0       0       0       0
5: hostname1  2015-01-26 01:15:28       0       0       0       0       0       0       0       0       0       0
6: hostname1  2015-01-26 01:30:29       0       0       0       0       0       0       0       0       0       0
   hdisk98 hdisk97 hdisk99 hdisk100 hdisk101 hdisk102 hdisk103 hdisk108 hdisk107 hdisk104 hdisk105 hdisk109 hdisk110
1:       0       0       0        0        0        0        0        0        0        0        0        0        0
2:       0       0       0        0        0        0        0        0        0        0        0        0        0
3:       0       0       0        0        0        0        0        0        0        0        0        0        0
4:       0       0       0        0        0        0        0        0        0        0        0        0        0
5:       0       0       0        0        0        0        0        0        0        0        0        0        0
6:       0       0       0        0        0        0        0        0        0        0        0        0        0
   hdisk112 hdisk111 hdisk113 hdisk114 hdisk115 hdisk116 hdisk117 hdisk87 hdisk118 hdisk120 hdisk119 hdisk122
1:        0        0        0        0        0        0        0       0        0        0        0        0
2:        0        0        0        0        0        0        0       0        0        0        0        0
3:        0        0        0        0        0        0        0       0        0        0        0        0
4:        0        0        0        0        0        0        0       0        0        0        0        0
5:        0        0        0        0        0        0        0       0        0        0        0        0
6:        0        0        0        0        0        0        0       0        0        0        0        0
   hdisk123 hdisk124 hdisk125 hdisk121 hdisk127 hdisk126 hdisk2 hdisk3 hdisk5 hdisk4 hdisk6 hdisk10 hdisk11 hdisk8
1:        0        0        0        0        0        0      0      0      0      0      0       0       0      0
2:        0        0        0        0        0        0      0      0      0      0      0       0       0      0
3:        0        0        0        0        0        0      0      0      0      0      0       0       0      0
4:        0        0        0        0        0        0      0      0      0      0      0       0       0      0
5:        0        0        0        0        0        0      0      0      0      0      0       0       0      0
6:        0        0        0        0        0        0      0      0      0      0      0       0       0      0
   hdisk12 hdisk9 hdisk18 hdisk14 hdisk15 hdisk17 hdisk16 hdisk13 hdisk106 hdisk19 hdisk20 hdisk7 hdisk21 hdisk28
1:       0      0       0       0       0       0       0       0        0       0       0      0       0       0
2:       0      0       0       0       0       0       0       0        0       0       0      0       0       0
3:       0      0       0       0       0       0       0       0        0       0       0      0       0       0
4:       0      0       0       0       0       0       0       0        0       0       0      0       0       0
5:       0      0       0       0       0       0       0       0        0       0       0      0       0       0
6:       0      0       0       0       0       0       0       0        0       0       0      0       0       0
   hdisk33 hdisk32 hdisk27 hdisk30 hdisk23 hdisk35 hdisk40 hdisk25 hdisk41 hdisk39 hdisk38 hdisk43 hdisk22 hdisk36
1:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
2:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
3:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
4:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
5:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
6:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
   hdisk31 hdisk45 hdisk29 hdisk44 hdisk34 hdisk37 hdisk48 hdisk24 hdisk47 hdisk42 hdisk46 hdisk49 hdisk53 hdisk50
1:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
2:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
3:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
4:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
5:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
6:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
   hdisk56 hdisk55 hdisk54 hdisk52 hdisk59 hdisk62 hdisk58 hdisk64 hdisk61 hdisk65 hdisk60 hdisk67 hdisk66 hdisk57
1:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
2:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
3:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
4:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
5:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
6:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
   hdisk51 hdisk69 hdisk63 hdisk74 hdisk70 hdisk72 hdisk75 hdisk68 hdisk73 hdisk76 hdisk71 hdisk78 hdisk85 hdisk81
1:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
2:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
3:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
4:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
5:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
6:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
   hdisk80 hdisk83 hdisk79 hdisk82 hdisk77 hdisk84 hdisk26 hdisk0 hdisk1 hdisk128 hdisk129 hdisk130 hdisk131 hdisk132
1:       0       0       0       0       0       0       0      0      0        0        0        0        0        0
2:       0       0       0       0       0       0       0      0      0        0        0        0        0        0
3:       0       0       0       0       0       0       0      0      0        0        0        0        0        0
4:       0       0       0       0       0       0       0      0      0        0        0        0        0        0
5:       0       0       0       0       0       0       0      0      0        0        0        0        0        0
6:       0       0       0       0       0       0       0      0      0        0        0        0        0        0
   hdisk133 hdisk134 hdisk135 hdisk136 hdisk137 hdisk138 hdisk139 hdisk140 hdisk141 hdisk142 hdisk143 hdisk144
1:        0        0        0        0        0        0        0        0        0        0        0        0
2:        0        0        0        0        0        0        0        0        0        0        0        0
3:        0        0        0        0        0        0        0        0        0        0        0        0
4:        0        0        0        0        0        0        0        0        0        0        0        0
5:        0        0        0        0        0        0        0        0        0        0        0        0
6:        0        0        0        0        0        0        0        0        0        0        0        0
   hdisk145 hdisk146 hdisk147 hdisk148 hdisk149
1:        0        0        0        0        0
2:        0        0        0        0        0
3:        0        0        0        0        0
4:        0        0        0        0        0
5:        0        0        0        0        0
6:        0        0        0        0        0

Что я пытаюсь сделать, так это взять средние, взвешенные средние и максимальные значения каждого столбца жесткого диска, транспонировать эти данные для последующей сортировки по взвешенному среднему, максимальному и среднему значению. Затем вернитесь к графику в виде гистограммы. Начнем ... Сначала возьмем сводную информацию (среднее, взвешенное среднее и максимум):

# Creating summary of I/O data (avg, wavg, max)...
c <- grep( "hdisk", names(DISKAVGRIO))
b <- c("Avg", "WAvg", "Max")
wavg = function(x) {
    wavg.return <- weighted.mean(x, x)
    if (is.nan(wavg.return)) {
        return(0)
    } else {
        return(wavg.return)
    }
}

my.summary = function(x) list(avg = mean(x), wavg = wavg(x), max = as.numeric(max(x)))
DT <- DISKAVGRIO[, lapply(.SD, my.summary), .SDcols=c]
DT[, `summary` := list("Avg", "WAvg", "Max")]
setcolorder(DT, c("summary", setdiff(names(DT), "summary")))

У меня есть следующая таблица данных:

   summary hdisk86 hdisk88 hdisk90 hdisk89 hdisk91 hdisk92 hdisk93 hdisk94 hdisk96 hdisk95 hdisk98 hdisk97 hdisk99
1:     Avg       0       0       0       0       0       0       0       0       0       0       0       0       0
2:    WAvg       0       0       0       0       0       0       0       0       0       0       0       0       0
3:     Max       0       0       0       0       0       0       0       0       0       0       0       0       0
   hdisk100 hdisk101 hdisk102 hdisk103 hdisk108 hdisk107 hdisk104 hdisk105 hdisk109 hdisk110 hdisk112 hdisk111
1:        0        0        0        0        0        0        0        0        0        0        0        0
2:        0        0        0        0        0        0        0        0        0        0        0        0
3:        0        0        0        0        0        0        0        0        0        0        0        0
   hdisk113 hdisk114 hdisk115 hdisk116 hdisk117 hdisk87 hdisk118 hdisk120 hdisk119 hdisk122 hdisk123 hdisk124
1:        0        0        0        0        0       0        0        0        0        0        0        0
2:        0        0        0        0        0       0        0        0        0        0        0        0
3:        0        0        0        0        0       0        0        0        0        0        0        0
   hdisk125 hdisk121 hdisk127 hdisk126 hdisk2 hdisk3 hdisk5 hdisk4 hdisk6 hdisk10 hdisk11 hdisk8 hdisk12 hdisk9
1:        0        0        0        0      0      0      0      0      0       0       0      0       0      0
2:        0        0        0        0      0      0      0      0      0       0       0      0       0      0
3:        0        0        0        0      0      0      0      0      0       0       0      0       0      0
   hdisk18 hdisk14 hdisk15 hdisk17 hdisk16 hdisk13 hdisk106 hdisk19 hdisk20 hdisk7 hdisk21 hdisk28 hdisk33 hdisk32
1:       0       0       0       0       0       0        0       0       0      0       0       0       0       0
2:       0       0       0       0       0       0        0       0       0      0       0       0       0       0
3:       0       0       0       0       0       0        0       0       0      0       0       0       0       0
   hdisk27 hdisk30 hdisk23 hdisk35 hdisk40 hdisk25 hdisk41 hdisk39 hdisk38 hdisk43 hdisk22 hdisk36 hdisk31 hdisk45
1:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
2:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
3:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
   hdisk29 hdisk44 hdisk34 hdisk37 hdisk48 hdisk24 hdisk47 hdisk42 hdisk46 hdisk49 hdisk53 hdisk50 hdisk56 hdisk55
1:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
2:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
3:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
   hdisk54 hdisk52 hdisk59 hdisk62 hdisk58 hdisk64 hdisk61 hdisk65 hdisk60 hdisk67 hdisk66 hdisk57 hdisk51 hdisk69
1:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
2:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
3:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
   hdisk63 hdisk74 hdisk70 hdisk72 hdisk75 hdisk68 hdisk73 hdisk76 hdisk71 hdisk78 hdisk85 hdisk81 hdisk80 hdisk83
1:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
2:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
3:       0       0       0       0       0       0       0       0       0       0       0       0       0       0
   hdisk79 hdisk82 hdisk77 hdisk84 hdisk26 hdisk0 hdisk1 hdisk128 hdisk129 hdisk130 hdisk131 hdisk132 hdisk133
1:       0       0       0       0       0      0      0        0        0        0        0        0        0
2:       0       0       0       0       0      0      0        0        0        0        0        0        0
3:       0       0       0       0       0      0      0        0        0        0        0        0        0
   hdisk134 hdisk135 hdisk136 hdisk137 hdisk138 hdisk139 hdisk140 hdisk141 hdisk142 hdisk143 hdisk144 hdisk145
1:        0        0        0        0        0        0        0        0        0        0        0        0
2:        0        0        0        0        0        0        0        0        0        0        0        0
3:        0        0        0        0        0        0        0        0        0        0        0        0
   hdisk146 hdisk147 hdisk148 hdisk149
1:        0        0        0        0
2:        0        0        0        0
3:        0        0        0        0

Затем трансформирую из широкого в длинный:

# Converting from wide to long...
d <- grep("hdisk", names(DT), value = T)
DT_mdf <- melt(DT, 
               id.vars="summary", 
               measure.vars=d,
               variable.name="hdisks",
               value.name="percentage")

И получите следующую таблицу данных:

     summary   hdisks percentage
  1:     Avg  hdisk86          0
  2:    WAvg  hdisk86          0
  3:     Max  hdisk86          0
  4:     Avg  hdisk88          0
  5:    WAvg  hdisk88          0
 ---                            
446:    WAvg hdisk148          0
447:     Max hdisk148          0
448:     Avg hdisk149          0
449:    WAvg hdisk149          0
450:     Max hdisk149          0

Затем я пытаюсь транспонировать:

# Transpose to sort by wavg...
DT3 <- dcast(DT_mdf, summary ~ hdisks)

И я получаю сообщение об ошибке:

Using percentage as value column: use value.var to override.
Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : 
  'x' must be atomic

Если я попытаюсь установить value.var = процент, я получаю следующее сообщение об ошибке:

Error in match(x, table, nomatch = 0L) : 
  'match' requires vector arguments

Почему это не работает? Предположительно, это сработает. У кого-нибудь есть идеи?


person Anderson Nobre    schedule 04.10.2015    source источник
comment
Возможно, вы можете немного упростить для нас ответ на ваш вопрос: использование dput(yourDF) или dput(head(yourDF, 10)) в R дает вам код, который вы можете включить в свой вопрос, который позволяет нам восстановить ваши данные за секунды.   -  person Jaap    schedule 04.10.2015


Ответы (1)


Ваша функция возвращает list, и использование lapply() в каждом столбце также приводит к тому, что каждая ячейка агрегированного результата также становится списком. Вы должны иметь возможность проверить это, посмотрев на класс всех столбцов. dcast() ищет атомарный тип.

В этом случае гораздо проще получить окончательный результат, используя c() вместо list() (обратите внимание, что тестировалось из-за отсутствия MRE):

summary.funs = c("mean", "wavg", "max")
my.summary = function(x) c(mean(x), wavg(x), as.numeric(max(x)))
DT <- DISKAVGRIO[, lapply(.SD, my.summary), .SDcols=c][, summary := summary.funs]

должен получить результат в окончательном формате.

Введение в data.table Виньетка объясняет, как эффективно использовать j для получения данных в желаемом формате.

Также может оказаться полезным Эффективное изменение формы с использованием данных. столы виньетка.

Чтобы получать обновления виньеток, добавьте в закладки / проверьте страницу Начало работы на вики-странице проекта. . Также следите за проблемой № 944 и страница CRAN data.table для виньеток, соответствующих текущей версии.

person Arun    schedule 04.10.2015
comment
Спасибо @Arun !!! Это сработало!!! Я прочитаю присланные вами ссылки, чтобы лучше понять. - person Anderson Nobre; 05.10.2015