#r
Вопрос:
Я только что начал использовать R, и это, возможно, очень простой вопрос — Я пытаюсь вычислить среднее значение нескольких переменных. Мои переменные-это доверие людей к разным вещам, измеряемое по шкале от 1 до 5.
- Я начал с:
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
- Затем я попытался:
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:
- Я также пытался:
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