0

我正在尝试找出一种从现有列创建复合度量的 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 ...

与 group_by() 一起使用的 sum() 函数给出的结果与我自己的公式相同。我对使用 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() ,但我不知道这些来自哪里。它们不是 3 列的手段。感谢您的快速评论!

4

1 回答 1

0

我真的很感激这些建议。我让 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 ...
于 2019-10-15T00:45:54.780 回答