R mutate для расчета относительной частоты встречаемости в группах - PullRequest
2 голосов
/ 02 июля 2019

Мне нужна помощь.

Допустим, у меня есть это:

# A tibble: 10 x 3
   a         b c    
   <chr> <dbl> <lgl>
 1 a         1 TRUE 
 2 a         1 TRUE 
 3 a         1 TRUE 
 4 a         2 TRUE 
 5 a         2 TRUE 
 6 a         2 FALSE
 7 a         2 FALSE
 8 a         3 FALSE
 9 a         3 FALSE
10 a         3 FALSE

structure(list(a = c("a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a"), b = c(1, 1, 1, 2, 2, 2, 2, 3, 3, 3), c = c(TRUE, TRUE, 
TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE)), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

Я хочу group_by столбец b и вычислить в каждой группе относительную частоту T == TRUE в столбце c, чтобы создать столбец d.

Итак, я хочу этот вывод:

# A tibble: 10 x 4
   a         b c         d
   <chr> <dbl> <lgl> <dbl>
 1 a         1 TRUE    1  
 2 a         1 TRUE    1  
 3 a         1 TRUE    1  
 4 a         2 TRUE    0.5
 5 a         2 TRUE    0.5
 6 a         2 FALSE   0.5
 7 a         2 FALSE   0.5
 8 a         3 FALSE   0  
 9 a         3 FALSE   0  
10 a         3 FALSE   0  

structure(list(a = c("a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a"), b = c(1, 1, 1, 2, 2, 2, 2, 3, 3, 3), c = c(TRUE, TRUE, 
TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE), d = c(1, 
1, 1, 0.5, 0.5, 0.5, 0.5, 0, 0, 0)), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

Предпочтительнее с dplyr или tidyverse.

Я пытался:

#1
t %>% 
  group_by(b) %>%
  mutate(
    d = nrow(c[c == T])/nrow()
  )
#2
t %>% 
  group_by(b) %>%
  mutate(
    d = count(c[c == T])/count()
  )
#3 
t %>% 
  group_by(b) %>%
  mutate(
    d = nrow(any(c[c == T]))/nrow(any())
  )

Никто не работал.

Похожие вопросы (но разные):
Как рассчитать относительную частоту по группам
R: относительная частота в r с коэффициентом

Любая помощь приветствуется.
Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Обычно, чтобы найти число раз, когда переменная встречается в группе, мы делаем

df %>%
  group_by(b) %>%
  mutate(d = sum(c == TRUE)/n())

, но поскольку здесь c является логическим вектором, мы также можем взять sum из c и затем разделить наколичество строк в группе.

library(dplyr)

df %>%
  group_by(b) %>%
  mutate(d = sum(c)/n())

#   a         b c         d
#   <chr> <dbl> <lgl> <dbl>
# 1 a         1 TRUE    1  
# 2 a         1 TRUE    1  
# 3 a         1 TRUE    1  
# 4 a         2 TRUE    0.5
# 5 a         2 TRUE    0.5
# 6 a         2 FALSE   0.5
# 7 a         2 FALSE   0.5
# 8 a         3 FALSE   0  
# 9 a         3 FALSE   0  
#10 a         3 FALSE   0  
1 голос
/ 02 июля 2019

Мы можем просто взять mean из 'c' после группировки по 'b'

library(dplyr)
df1 %>%
    group_by(b) %>% 
    mutate(d = mean(c))
# A tibble: 10 x 4
# Groups:   b [3]
#   a         b c         d
#   <chr> <dbl> <lgl> <dbl>
# 1 a         1 TRUE    1  
# 2 a         1 TRUE    1  
# 3 a         1 TRUE    1  
# 4 a         2 TRUE    0.5
# 5 a         2 TRUE    0.5
# 6 a         2 FALSE   0.5
# 7 a         2 FALSE   0.5
# 8 a         3 FALSE   0  
# 9 a         3 FALSE   0  
#10 a         3 FALSE   0  

ПРИМЕЧАНИЕ: mean - определение - «среднее», к которому вы привыкли, где вы складываете все числа, а затем делите их на количество чисел.


Другой вариант -

df1 %>%
   group_by(b) %>%
   mutate(d = sum(as.integer(c))/n())

Или используя data.table

library(data.table)
setDT(df1)[, d := mean(c), by = b]

Или используя base R

df1$d <- with(df1, ave(c, b))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...