Arhn - архитектура программирования

dplyr, R: подсчет определенного значения сразу в нескольких столбцах

У меня есть кадр данных:

md <- data.frame(a = c(3,5,4,5,3,5), b = c(5,5,5,4,4,1), c = c(1,3,4,3,5,5),
      device = c(1,1,2,2,3,3))
myvars = c("a", "b", "c")
md[2,3] <- NA
md[4,1] <- NA
md

Я хочу подсчитать количество 5 в каждом столбце - по устройству. Я могу сделать это так:

library(dplyr)
group_by(md, device) %>% 
summarise(counts.a = sum(a==5, na.rm = T),
          counts.b = sum(b==5, na.rm = T),
          counts.c = sum(c==5, na.rm = T))

Однако в реальной жизни у меня будет куча переменных (длина myvars может быть очень большой) - так что я не смогу указать эти counts.a, counts.b и т. д. вручную - десятки раз.

Позволяет ли dplyr запускать подсчет 5 секунд во всех столбцах myvars одновременно?

Благодарю вас!

16.06.2015

  • См. ?summarise_each и stackoverflow.com/questions/ 21644848/ 16.06.2015
  • Я не уверен, как получить туда имена, но это работает: md %>% group_by(device) %>% summarise_each(funs(counts=sum(.==5,na.rm=TRUE))) 16.06.2015
  • @Frank Может быть md %>% group_by(device) %>% select_(.dots=myvars) %>% summarise_each(funs(counts=sum(.==5,na.rm=TRUE))) или просто md %>% group_by(device) %>% summarise_each_(funs(counts=sum(.==5, na.rm=TRUE)), myvars) 16.06.2015
  • @akrun По-прежнему нет имен в результате, когда я запускаю любой из них (R 3.2.0, dplyr 0.4.1). Кажется, что summarise_each просто игнорирует имена внутри funs... 16.06.2015
  • @Frank Ты пробовал с summarise_each_ 16.06.2015
  • @akrun Да, я попробовал вторую версию в вашем комментарии, но по-прежнему вижу a b c в качестве столбцов, а counts нигде не появляется. 16.06.2015
  • @Frank Неважно, я думал о другом. Я думаю, вы говорите о count.a, count.b и т. д. в именах, правильно 16.06.2015

Ответы:


1

Если вам небезразличны имена, начинающиеся с «количество». вы можете сделать это в канале dplyr следующим образом:

md %>% 
  group_by(device) %>% 
  summarise_each_(funs(sum(.==5,na.rm=TRUE)), myvars) %>% 
  setNames(c(names(.)[1], paste0("counts.", myvars)))
#Source: local data frame [3 x 4]
#
#  device counts.a counts.b counts.c
#1      1        1        2        0
#2      2        0        1        0
#3      3        1        0        2

Есть еще один вопрос и ответ о том, как можно назвать новые столбцы, созданные mutate_each dplyr (который ведет себя так же, как summarise_each) здесь: mutate_each в dplyr: как мне выбрать определенные столбцы и дать новые имена измененным столбцам?.

16.06.2015

2

В этом случае может пригодиться функция melt() из пакета reshape2. Возможно, вы захотите попробовать это:

 library(reshape2)
 mydf <- melt(md,id="device")
 thefives <- mydf[which(mydf$value==5),]
 print(table(thefives))

Вот результат:

, , value = 5

     variable
device a b c
     1 1 2 0
     2 0 1 0
     3 1 0 2

При необходимости формат table, полученный из этого вывода, можно преобразовать в data.frame, предварительно преобразовав его в matrix:

mydf <- as.data.frame(matrix(table(thefives),nrow=3))
colnames(mydf) <- c("a","b","c")
rownames(mydf) <-paste0("device_",c(1:3))
print(mydf)

Это дает следующий результат:

         a b c
device_1 1 2 0
device_2 0 1 0
device_3 1 0 2

> class(mydf)
[1] "data.frame"
16.06.2015
  • Спасибо. Я знаю, как это сделать в Base R, и reshape2 тоже хорошая идея. Но я хочу знать, возможно ли это сделать в dplyr. 16.06.2015
  • Кроме того, структура вывода table() неудобна. Мне нужен фрейм данных в конце. 16.06.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..