Подсчет количества значений, но самое распространенное в data.frame, с R - PullRequest
0 голосов
/ 17 февраля 2012

Пример данных:

    > ind1
             Ind Gb19a Gb19b Gb24a Gb24b Gb28a Gb28b Gb11a Gb11b
    1  9-2-J1-N3   378   386   246   248   360   372   162   261
    2  9-2-J1-N3   380   386   246   248   360   372   187   261
    14 9-2-J1-N3   380   386   246   248    NA    NA    NA    NA
    15 9-2-J1-N3    NA   246   248   360   187    NA    NA    NA
    16 9-2-J1-N3   380   386   380   386   378   386   380   386
    17 9-2-J1-N3   380   386   246   248   360   372   187   261
    19 9-2-J1-N3   360   372   360   372   360   372   360   372
    20 9-2-J1-N3   187   261   187   261   162   261   187   261
    21 9-2-J1-N3   380   386   240   246   360   372   187    NA

> class(ind1)
[1] "data.frame"

Так что мне нужно посчитать, для каждого столбца, сколько значений, но самое распространенное. Ожидаемый результат будет:

Gb19a 3
Gb19b 3
Gb24a 5
экт ...

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

 > table(ind1$Gb19a)

    187 360 378 380 
      1   1   1   5

    counts1 <- as.data.frame(table(ind1$Gb19a), stringsAsFactors = FALSE)
    modal_value1 <- which.max(counts1$Freq)
    (sum(counts1$Freq)-counts1$Freq[modal_value1])
    [1] 3

Как применить это ко всему data.frame?

Как всегда, спасибо за любую помощь!

Ответы [ 4 ]

2 голосов
/ 17 февраля 2012

Вы просто говорите слово!
(«Как применить это ко всему data.frame?»)

countValsButMostFreq <- function(values){
  counts1 <- as.data.frame(table(values), stringsAsFactors = FALSE)
  modal_value1 <- which.max(counts1$Freq)
  return (sum(counts1$Freq)-counts1$Freq[modal_value1])
}

ind1 <- rbind.data.frame(
c('9-2-J1-N3',   378,   386,   246,   248,   360,   372,   162,   261),
c('9-2-J1-N3',   380,   386,   246,   248,   360,   372,   187,   261),
c('9-2-J1-N3',   380,   386,   246,   248,    NA,    NA,    NA,    NA),
c('9-2-J1-N3',    NA,   246,   248,   360,   187,    NA,    NA,    NA),
c('9-2-J1-N3',   380,   386,   380,   386,   378,   386,   380,   386),
c('9-2-J1-N3',   380,   386,   246,   248,   360,   372,   187,   261),
c('9-2-J1-N3',   360,   372,   360,   372,   360,   372,   360,   372),
c('9-2-J1-N3',   187,   261,   187,   261,   162,   261,   187,   261),
c('9-2-J1-N3',   380,   386,   240,   246,   360,   372,   187,    NA))
colnames(ind1) <- c('Ind', 'Gb19a', 'Gb19b', 'Gb24a', 'Gb24b', 'Gb28a', 'Gb28b', 'Gb11a', 'Gb11b')



res <- apply(X=ind1,MARGIN=2,FUN=countValsButMostFreq)
res

Результат:

  Ind Gb19a Gb19b Gb24a Gb24b Gb28a Gb28b Gb11a Gb11b 
    0     3     3     5     5     3     2     3     2
2 голосов
/ 17 февраля 2012

Вот пример того, как это сделать для mtcars:

as.data.frame(
    lapply(mtcars, 
        function(x)unname(tail(sort(table(x)), 1))
    )
)

  mpg cyl disp hp drat wt qsec vs am gear carb
1   2  14    3  3    3  3    2 18 19   15   10

Как это работает?

Настройка функции для получения подсчета частоты для одногостолбец:

  • Используйте table, чтобы получить свои цифры
  • Sort результаты
  • Получите последнее значение с помощью tail
  • Используйте unname, чтобы сбросить имя

Затем просто передайте это lapply и преобразуйте результаты в data.frame

1 голос
/ 17 февраля 2012

Вы ищете подходящую семью.Я бы, наверное, использовал здесь sapply, но это ваш выбор.

   ind1 <- read.table(text="Ind Gb19a Gb19b Gb24a Gb24b Gb28a Gb28b Gb11a Gb11b
    1  9-2-J1-N3   378   386   246   248   360   372   162   261
    2  9-2-J1-N3   380   386   246   248   360   372   187   261
    14 9-2-J1-N3   380   386   246   248    NA    NA    NA    NA
    15 9-2-J1-N3    NA   246   248   360   187    NA    NA    NA
    16 9-2-J1-N3   380   386   380   386   378   386   380   386
    17 9-2-J1-N3   380   386   246   248   360   372   187   261
    19 9-2-J1-N3   360   372   360   372   360   372   360   372
    20 9-2-J1-N3   187   261   187   261   162   261   187   261
    21 9-2-J1-N3   380   386   240   246   360   372   187    NA", header=TRUE)

hapax <- function(x) {x <- na.omit(x); length(setdiff(unique(x), x[duplicated(x)]))}
sapply(ind1, hapax)
0 голосов
/ 17 февраля 2012

apply (mymatrix, 2, myfunc) запускает myfunc (один столбец) для каждой матрицы столбца или фрейма данных.

myfunc будет кодом, который вы отправили для расчета суммы, за исключением того, что ind1 $ Gb19a заменяется одним столбцом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...