Подсчитать значения всего фрейма данных - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть этот фрейм данных:

> df
   X1 X2 X3 X4 X5 X6 X7
1   2  7  2  3  5  6  7
2   4  2  3  6  1 NA  3
3   3  6  4  4  4  7  7
4   6  5  6 NA  3  1  7
5   1  1  2  3  3  3  7
6   4  7  2  4  5  4  2
7   5 NA  4  5  2  2  3
8   3  7  2  4  4  1  5
9   4  5  6  2  5  6  3
10  2  4  6  4  5  6  3

И я хочу сосчитать числа 1,2,3,4 и присвоить его x, 6,7 и присвоить его y, и все числа(1,2,3,4,5,6,7) до z.После этого я вычислю y/z - x/z.

Я сделал это с помощью table(unlist(df)) и после индивидуального присвоения значения.Тем не менее, я ищу решение без цикла или apply(), так как я не вижу способа увеличить их, поскольку у меня есть около 100 столбцов и 10.000 строк (я знаю, что все они являются целыми числами от 1 до 7и NA values).

Я ищу решение, подобное этому:

x <- count(df, c(1,2,3,4), na.rm = TRUE)
y <- count(df, c(6,7), na.rm = TRUE)
z <- count(df, c(1,2,3,4,5,6,7), na.rm = TRUE)

Однако, похоже, что count() не работает так, как и не существует функции, которая делает это.

Есть предложения?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Вот вариант с использованием tidyverse

library(tidyverse)
gather(df, na.rm = TRUE) %>%
   count(value) %>% 
   mutate(n1 = sum(n)) %>%
   filter(value %in% c(1:4, 6:7)) %>% 
   group_by(grp = value %in% 1:4) %>% 
   summarise(perc = sum(n)/first(n1)) %>% 
   summarise(z = diff(perc))
# A tibble: 1 x 1
#      z
#   <dbl>
# 1 0.358
0 голосов
/ 19 февраля 2019

Другой подход, основанный на table(), помещающий вашу подсчетную структуру в список.

count <- setNames(lapply(list(1:4, 6:7, 1:7), function(x){
  tab <- table(unlist(d))
  return(sum(tab[x]))
 }), tail(letters, 3))

> with(count, y/z - x/z)
[1] -0.358209

Данные

d <- structure(list(X1 = c(2L, 4L, 3L, 6L, 1L, 4L, 5L, 3L, 4L, 2L), 
    X2 = c(7L, 2L, 6L, 5L, 1L, 7L, NA, 7L, 5L, 4L), X3 = c(2L, 
    3L, 4L, 6L, 2L, 2L, 4L, 2L, 6L, 6L), X4 = c(3L, 6L, 4L, NA, 
    3L, 4L, 5L, 4L, 2L, 4L), X5 = c(5L, 1L, 4L, 3L, 3L, 5L, 2L, 
    4L, 5L, 5L), X6 = c(6L, NA, 7L, 1L, 3L, 4L, 2L, 1L, 6L, 6L
    ), X7 = c(7L, 3L, 7L, 7L, 7L, 2L, 3L, 5L, 3L, 3L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))
0 голосов
/ 19 февраля 2019

Базовое решение R.

vec <- unlist(df)

vec_c <- table(vec)

x <- sum(vec_c[names(vec_c) %in% as.character(1:4)])
y <- sum(vec_c[names(vec_c) %in% as.character(6:7)])
z <- sum(vec_c)

y/z - x/z
# [1] -0.358209

Другая идея.

vec <- unlist(df)

x <- sum(vec %in% 1:4)
y <- sum(vec %in% 6:7)
z <- length(vec[!is.na(vec)])

y/z - x/z
# [1] -0.358209

Другая идея.

m <- as.matrix(df)

x <- sum(m %in% 1:4)
y <- sum(m %in% 6:7)
z <- sum(!is.na(df))

y/z - x/z
# [1] -0.358209

ДАННЫЕ

df <- read.table(text = "   X1 X2 X3 X4 X5 X6 X7
1   2  7  2  3  5  6  7
                 2   4  2  3  6  1 NA  3
                 3   3  6  4  4  4  7  7
                 4   6  5  6 NA  3  1  7
                 5   1  1  2  3  3  3  7
                 6   4  7  2  4  5  4  2
                 7   5 NA  4  5  2  2  3
                 8   3  7  2  4  4  1  5
                 9   4  5  6  2  5  6  3
                 10  2  4  6  4  5  6  3",
                 header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...