Я только начал использовать 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 ()? Большое спасибо :)

r
2
Qian Lee 9 Окт 2021 в 21:25

2 ответа

Лучший ответ

Возможно, нам понадобится использовать 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
akrun 9 Окт 2021 в 18:42

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

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
0
Marek Fiołka 9 Окт 2021 в 19:50