dplyr означает проблемы (аргумент не является числом c или логическим: возвращается NA) - PullRequest
0 голосов
/ 01 августа 2020
DF <- data.frame(id=c(1,1,2,2,3,3,4,4), A = c(1,2,10,4,8,NA,NA,2))

Почему это не работает?:

DF%>%mean(A,na.rm=T)
[1] NA
Warning message:
In mean.default(., A, na.rm = T) :
  argument is not numeric or logical: returning NA

А у него работает?:

> mean(DF$A,na.rm=T)
[1] 4.5


glimpse(DF)
Observations: 8
Variables: 2
$ id <chr> "1", "1", "2", "2", "3", "3", "4", "4"
$ A  <dbl> 1, 2, 10, 4, 8, NA, NA, 2

Идея позже состоит в том, чтобы mutate () создать новый столбец с среднее для каждого идентификатора.

Best H

EDIT:

Дополнительный вопрос. Спасибо за ответы. Теперь я хочу вычислить среднее значение в каждой группе, но дублирование значений может быть подсчитано только один раз. См. Пример.

Я хочу это:

DF<-data.frame(id=c(1,1,1,2,2,2,3,3,3,4,4,4), A=c(2,2,1,1,2,3,4,4,1,NA,2,2))
> DF
   id  A
1   1  2
2   1  2
3   1  1
4   2  1
5   2  2
6   2  3
7   3  4
8   3  4
9   3  1
10  4 NA
11  4  2
12  4  2

Чтобы закончить так:

  id  A mean
1   1  2  1.5
2   1  2  1.5
3   1  1  1.5
4   2  1    2
5   2  2    2
6   2  3    2
7   3  4  2.5
8   3  4  2.5
9   3  1  2.5
10  4 NA    2
11  4  2    2
12  4  2    2

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

mean ожидает вектор, пока 'A' не извлекается. Мы можем использовать .$

library(dplyr)
DF %>%
    {mean(.$A, na.rm = TRUE)}
#[1] 4.5

Или, если мы хотим избежать {}

DF %>%
   .$A %>% # \\ or use: pull(A)
   mean(na.rm = TRUE)
#[1] 4.5
1 голос
/ 01 августа 2020

функция mean принимает в качестве аргумента векторы, а не фреймы данных, поэтому вы не можете просто передать DF. Вы должны использовать summarize:

DF %>%
  summarize(mean(A, na.rm = TRUE))

  mean(A, na.rm = TRUE)
1                   4.5

Если вам нужно среднее значение по группе, вы можете использовать group_by:

DF %>%
  group_by(id) %>%
  summarize(mean(A, na.rm = TRUE))

     id `mean(A, na.rm = TRUE)`
  <dbl>                   <dbl>
1     1                     1.5
2     2                     7  
3     3                     8  
4     4                     2  

И если вы хотите сохранить каждую строку но добавьте сгруппированные средства, вы замените summarize на mutate:

DF %>%
  group_by(id) %>%
  mutate(mean(A, na.rm = TRUE))

# Groups:   id [4]
     id     A `mean(A, na.rm = TRUE)`
  <dbl> <dbl>                   <dbl>
1     1     1                     1.5
2     1     2                     1.5
3     2    10                     7  
4     2     4                     7  
5     3     8                     8  
6     3    NA                     8  
7     4    NA                     2  
8     4     2                     2 

EDIT:

Если вы хотите сохранить все строки, но только подсчитайте отдельные для вашего среднего значения, вы можете использовать row_number для сброса для каждой уникальной строки, а затем взвесить свое среднее значение в зависимости от того, равен ли номер строки 1:

DF <- data.frame(id=c(1,1,1,2,2,2,3,3,3,4,4,4), 
                 A=c(2,2,1,1,2,3,4,4,1,NA,2,2))

DF %>%
  group_by(id, A) %>%
  mutate(count = row_number()) %>%
  group_by(id) %>%
  mutate(mean = weighted.mean(A, count == 1, na.rm = TRUE))

      id     A count  mean
   <dbl> <dbl> <int> <dbl>
 1     1     2     1   1.5
 2     1     2     2   1.5
 3     1     1     1   1.5
 4     2     1     1   2  
 5     2     2     1   2  
 6     2     3     1   2  
 7     3     4     1   2.5
 8     3     4     2   2.5
 9     3     1     1   2.5
10     4    NA     1   2  
11     4     2     1   2  
12     4     2     2   2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...