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

#r

Вопрос:

Я только что начал использовать R, и это, возможно, очень простой вопрос — Я пытаюсь вычислить среднее значение нескольких переменных. Мои переменные-это доверие людей к разным вещам, измеряемое по шкале от 1 до 5.

  1. Я начал с:
 intp.trust <- EU_value_study %>%
          summarise(average_intp.trust = mean(v32:v37))

 

и получил предупреждение:

 Warning messages:
1: In v32:v37 :
  numerical expression has 56368 elements: only the first used
2: In v32:v37 :
  numerical expression has 56368 elements: only the first used
 

Я получил результат, но я думаю, что этот результат может быть неправильным из-за предыдущего предупреждения?

 > intp.trust
# A tibble: 1 × 1
  average_intp.trust
               <dbl>
1                  1

 
  1. Затем я попытался:
 intp.trust <- EU_value_study %>%
  rowwise()%>%
  summarise(average_intp.trust = mean(v32:v37))
 

полученная ошибка:

 Error: Problem with `summarise()` column `average_intp.trust`.
ℹ `average_intp.trust = mean(v32:v37)`.
x NA/NaN argument
ℹ The error occurred in row 8.
Backtrace:
 
  1. Я также пытался:
 intp.trust <- EU_value_study %>%
  summarise(average_intp.trust = rowwise_mean(v32:v37))
 

также получена ошибка:

 Error: Problem with `summarise()` column `average_intp.trust`.
ℹ `average_intp.trust = rowwise_mean(v32:v37)`.
x could not find function "rowwise_mean"
Backtrace:
 1. EU_value_study %>% summarise(average_intp.trust = rowwise_mean(v32:v37))
 7. base::.handleSimpleError(...)
 8. dplyr:::h(simpleError(msg, call))
 

может ли кто-нибудь помочь мне с ошибкой?
Должен ли я использовать mutate() вместо summarize()?
Большое спасибо 🙂

Ответ №1:

Возможно, нам потребуется использовать c_across в rowwise

 library(haven)
EU_value_study %>%
  zap_labels() %>%
  rowwise()%>%
  transmute(average_intp.trust = mean(c_across(v32:v37), 
       na.rm = TRUE), .groups = 'drop')
 

Кроме того, вместо rowwise того, чтобы с mean которым должно быть медленно, используйте векторизованный rowMeans

 EU_value_study %>%
    zap_labels() %>%
    transmute(average_intp.trust = rowMeans(across(v32:v37), na.rm = TRUE))
 

ПРИМЕЧАНИЕ: summarise Это сработало бы, но построчное выражение на самом деле mean не является обобщением, т. е. оно вернет то же количество строк, что и в исходных данных. Таким образом, технически это mutate/transmute ( transmute — если нам нужен только этот столбец в качестве вывода)

Комментарии:

1. Привет, спасибо! Я все еще получил ошибку из вашего кода, которая Error: Problem with `mutate()` column `average_intp.trust`. ℹ `average_intp.trust = mean(c_across(v32:v37), na.rm = TRUE)`. x Can't use a name specification with non-vctrs types. vctrs methods must be implemented for class `haven_labelled`. See <https://vctrs.r-lib.org/articles/s3-vector.html>. ℹ The error occurred in row 1. Backtrace: 1. `%>%`(...) 12. base::.handleSimpleError(...) 13. dplyr:::h(simpleError(msg, call))

2. @QianLee Это работает с воспроизводимым примером head(mtcars) %>% rowwise %>% transmute(average = mean(c_across(vs:gear))) %>% ungroup %>% pull(average)# [1] 1.666667 1.666667 2.000000 1.333333 1.000000 1.333333

3. @QianLee Хорошо, это другой класс, то есть у вас есть некоторые атрибуты, помеченные как haven

4. @QianLee, не могли бы вы попробовать обновление

5. Привет, так должен ли я преобразовать атрибуты с метками haven в коэффициент или удалить метки, прежде чем вычислять среднее значение?

Ответ №2:

Я предполагаю, что ваши данные выглядят так

 library(tidyverse)

n=100
df = tibble(
  id = rep(1:100, 50),
  var = rep(paste0("v",1:50), each=n),
  val = sample(1:5, 5000, replace = TRUE)
) %>% pivot_wider(id, names_from = var, values_from = val)
 

выход

 # A tibble: 100 x 51
      id    v1    v2    v3    v4    v5    v6    v7    v8    v9   v10   v11   v12   v13   v14   v15   v16   v17   v18   v19   v20   v21
   <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
 1     1     5     3     3     2     4     1     5     2     5     2     1     3     3     5     4     4     5     3     5     1     4
 2     2     5     4     1     3     3     4     3     4     3     3     2     4     5     4     2     5     4     3     4     2     1
 3     3     5     1     3     1     3     3     4     2     5     2     5     1     5     1     4     4     3     3     5     3     1
 4     4     3     1     1     1     4     5     2     1     2     4     5     3     1     4     1     5     5     1     1     1     4
 5     5     1     4     1     4     4     1     2     4     5     4     1     2     4     4     5     5     5     3     4     3     2
 6     6     2     5     5     2     1     2     4     3     4     4     5     3     3     4     2     4     1     2     1     5     5
 7     7     5     2     1     2     4     5     5     2     1     5     3     2     1     4     2     3     1     1     4     2     2
 8     8     3     3     1     3     2     1     4     1     4     4     2     5     3     2     3     3     1     3     4     4     4
 9     9     5     3     3     4     3     2     2     2     1     5     5     2     3     3     3     5     4     3     4     1     5
10    10     5     2     5     2     1     1     5     4     4     4     2     4     1     2     1     3     5     4     5     5     5
# ... with 90 more rows, and 29 more variables: v22 <int>, v23 <int>, v24 <int>, v25 <int>, v26 <int>, v27 <int>, v28 <int>, v29 <int>,
#   v30 <int>, v31 <int>, v32 <int>, v33 <int>, v34 <int>, v35 <int>, v36 <int>, v37 <int>, v38 <int>, v39 <int>, v40 <int>, v41 <int>,
#   v42 <int>, v43 <int>, v44 <int>, v45 <int>, v46 <int>, v47 <int>, v48 <int>, v49 <int>, v50 <int>
 

Итак, у нас есть 100 строк и 50 v переменных.

Если вам нужно среднее значение переменных v32: v37 , сделайте это

 df %>% pivot_longer(v32:v37) %>% 
  summarise(
    n = n(),
    intp.trust = mean(value))
 

выход

 # A tibble: 1 x 2
      n intp.trust
  <int>      <dbl>
1   600       3.06
 

pivot_longer Функция превратит ваши переменные в две переменные. Смотрите этот пример

 df %>% pivot_longer(v1:v50)
 

выход

 # A tibble: 5,000 x 3
      id name  value
   <int> <chr> <int>
 1     1 v1        5
 2     1 v2        3
 3     1 v3        3
 4     1 v4        2
 5     1 v5        4
 6     1 v6        1
 7     1 v7        5
 8     1 v8        2
 9     1 v9        5
10     1 v10       2
# ... with 4,990 more rows
 

Теперь просто используйте summarise

 df %>% pivot_longer(v1:v50) %>% 
  summarise(
    n = n(),
    intp.trust = mean(value))
 

выход

 # A tibble: 1 x 2
      n intp.trust
  <int>      <dbl>
1  5000       3.00