метод tidyverse для создания составных мер

Я пытаюсь найти способ создания составной меры из существующих столбцов. Я не понимаю, почему я получаю целое число при попытке вычислить среднее значение с помощью функции mean ().

Я читал, что использование rowwise () не рекомендуется, поэтому я попробовал решение с использованием group_by ().

library(tidyverse)
tstdata <- tibble(id=1:30
                  ,fake1 = sample(c(1:7), replace = TRUE, size=30)
                  ,fake2 = sample(c(1:7), replace = TRUE, size=30)
                  ,fake3 = sample(c(1:7), replace = TRUE, size=30))
tstdata %>% mutate(fakeadd = fake1 + fake2 + fake3) -> tstdata
tstdata %>% group_by(id) %>% mutate(fakesum = sum(fake1,fake2,fake3)) %>% ungroup() -> tstdata
tstdata %>% mutate(fakeavg = (fake1+fake2+fake3)/3) -> tstdata
tstdata %>% group_by(id) %>% mutate(fakemean = mean(fake1,fake2,fake3)) %>% ungroup() -> tstdata

str(tstdata)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   30 obs. of  8 variables:
 $ id      : int  1 2 3 4 5 6 7 8 9 10 ...
 $ fake1   : int  6 5 6 7 6 6 5 3 4 3 ...
 $ fake2   : int  7 5 4 6 7 7 5 6 6 5 ...
 $ fake3   : int  1 2 2 1 3 7 2 1 4 6 ...
 $ fakeadd : int  14 12 12 14 16 20 12 10 14 14 ...
 $ fakesum : int  14 12 12 14 16 20 12 10 14 14 ...
 $ fakeavg : num  4.67 4 4 4.67 5.33 ...
 $ fakemean: int  6 5 6 7 6 6 5 3 4 3 ...

Функция sum (), используемая с group_by (), дает тот же результат, что и моя собственная формула. Меня смущают результаты использования функции mean (). Я получаю целые числа в этом столбце, которые в некоторых случаях даже не округляются должным образом. Я хотел бы иметь возможность обрабатывать недостающие данные с помощью na.rm. Что мне не хватает? У меня больше опыта работы с SPSS, и я новичок в концепциях Tidyverse.

Я добавил пару строк на основе предложений в комментариях:

library(tidyverse)
tstdata <- tibble(id=1:30
                  ,fake1 = sample(c(1:7), replace = TRUE, size=30)
                  ,fake2 = sample(c(1:7), replace = TRUE, size=30)
                  ,fake3 = sample(c(1:7), replace = TRUE, size=30))
tstdata %>% mutate(fakeadd = fake1 + fake2 + fake3) -> tstdata
tstdata %>% group_by(id) %>% mutate(fakesum = sum(fake1,fake2,fake3)) %>% ungroup() -> tstdata
tstdata %>% mutate(fakeavg = (fake1+fake2+fake3)/3) -> tstdata
tstdata %>% group_by(id) %>% mutate(fakemean = mean(fake1,fake2,fake3)) %>% ungroup() -> tstdata
tstdata %>% mutate(fakerowmean = rowMeans(.[c(fake1,fake2,fake3)])) -> tstdata
tstdata %>% group_by(id) %>% mutate(fakemean3 = mean(c(fake1,fake2,fake3))) %>% ungroup() -> tstdata
str(tstdata)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   30 obs. of  10 variables:
 $ id         : int  1 2 3 4 5 6 7 8 9 10 ...
 $ fake1      : int  5 6 1 3 3 3 7 7 1 4 ...
 $ fake2      : int  5 1 6 6 3 6 1 6 7 5 ...
 $ fake3      : int  6 4 1 6 2 1 6 4 5 6 ...
 $ fakeadd    : int  16 11 8 15 8 10 14 17 13 15 ...
 $ fakesum    : int  16 11 8 15 8 10 14 17 13 15 ...
 $ fakeavg    : num  5.33 3.67 2.67 5 2.67 ...
 $ fakemean   : int  5 6 1 3 3 3 7 7 1 4 ...
 $ fakerowmean: num  8.02 5.72 4.57 8.17 4.91 ...
 $ fakemean3  : num  5.33 3.67 2.67 5 2.67 ...

Теперь изменение аргументов в функции mean () дает совпадающие результаты. Я пробовал использовать rowMeans () так, как он был отформатирован в комментариях, но я не знаю, откуда они берутся. Они не являются средствами трех столбцов. Спасибо за быстрые комментарии!


person CiM    schedule 14.10.2019    source источник
comment
Похоже, вам нужен rowMeans(.[c('fake1', 'fake2', 'fake3')])   -  person akrun    schedule 14.10.2019
comment
Функция mean() работает с вектором, а не с параметрами, которые вы ей передаете. Посмотрите разницу в результатах между mean(1,2,3) и mean(c(1,2,3))   -  person MrFlick    schedule 14.10.2019
comment
Возможный дубликат: stackoverflow.com/ questions / 10945703 /   -  person GenesRus    schedule 15.10.2019


Ответы (1)


Я очень ценю предложения. Я заставил работать функции rowMeans () и mean (). Вот рабочий пример.

library(tidyverse)
tstdata <- tibble(id=1:30
                  ,fake1 = sample(c(1:7), replace = TRUE, size=30)
                  ,fake2 = sample(c(1:7), replace = TRUE, size=30)
                  ,fake3 = sample(c(1:7), replace = TRUE, size=30))
tstdata %>% mutate(fakeadd = fake1 + fake2 + fake3) -> tstdata
tstdata %>% group_by(id) %>% mutate(fakesum = sum(c(fake1,fake2,fake3))) %>% ungroup() -> tstdata
tstdata %>% mutate(fakeavg = (fake1+fake2+fake3)/3) -> tstdata
tstdata %>% mutate(fakerowmean = rowMeans(.[c("fake1","fake2","fake3")])) -> tstdata
tstdata %>% group_by(id) %>% mutate(fakemean3 = mean(c(fake1,fake2,fake3))) %>% ungroup() -> tstdata
str(tstdata)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   30 obs. of  9 variables:
 $ id         : int  1 2 3 4 5 6 7 8 9 10 ...
 $ fake1      : int  5 2 2 6 6 6 1 7 2 6 ...
 $ fake2      : int  5 4 1 4 2 4 6 6 4 6 ...
 $ fake3      : int  6 7 2 5 1 3 7 1 5 6 ...
 $ fakeadd    : int  16 13 5 15 9 13 14 14 11 18 ...
 $ fakesum    : int  16 13 5 15 9 13 14 14 11 18 ...
 $ fakeavg    : num  5.33 4.33 1.67 5 3 ...
 $ fakerowmean: num  5.33 4.33 1.67 5 3 ...
 $ fakemean3  : num  5.33 4.33 1.67 5 3 ...
person CiM    schedule 15.10.2019