Подсчитать количество вхождений строки в выбранные столбцы - PullRequest
1 голос
/ 28 мая 2020

У меня есть фрейм данных df и конкретные столбцы, которые меня интересуют myCol.

df <- data.frame("Col1"=c("yes", "yes", "no"), "Col2"=c("no", "no", "yes"), "Col3"=c("no", "yes", "no"), "Col4"=c("yes", "yes", "yes"))

df
  Col1 Col2 Col3 Col4
1  yes   no   no  yes
2  yes   no  yes  yes
3   no  yes   no  yes

myCol <- c("Col1", "Col2", "Col4")

Я пытаюсь подсчитать (по столбцам) количество no и yes для * Только 1008 * столбцов.

Я пробовал с summarise, count, table, но он либо возвращает ошибки, либо вложенные подсчеты.

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ

Для пояснения мой вывод может выглядеть примерно так:

    Col1  Col2  Col4
no     1     2     0
yes    2     1     3

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Один вариант dplyr и purrr может быть:

map_dfc(.x = c("yes", "no"),
        ~ df %>%
         transmute(!!.x := rowSums(select(., one_of(myCol)) == .x)))

  yes no
1   2  1
2   2  1
3   2  1

Если вам действительно нужна сумма по столбцам:

map_dfc(.x = c("yes", "no"),
        ~ df %>%
         summarise(!!.x := sum(rowSums(select(., one_of(myCol)) == .x))))

  yes no
1   6  3

Чтобы соответствовать выходу OP, используя dplyr и tidyr:

df %>%
 select(one_of(myCol)) %>%
 pivot_longer(everything()) %>%
 count(name, value) %>%
 pivot_wider(names_from = "name", values_from = "n", values_fill = list(n = 0))

  value  Col1  Col2  Col4
  <fct> <int> <int> <int>
1 no        1     2     0
2 yes       2     1     3
0 голосов
/ 28 мая 2020

Простое базовое решение R, если вы просто хотите подсчитать общее количество «да» и «нет» в этих столбцах:

table(sapply(myCol, function(x) df[[x]]))

#> no yes 
#>  3   6 

Или для отдельных столбцов:

sapply(myCol, function(x) table(factor(df[[x]], levels = c("no", "yes"))))
#>     Col1 Col2 Col4
#> no     1    2    0
#> yes    2    1    3
...