重新排列行和列+在R中使用平均分数

Rearranging rows and columns + using mean score in R

我现在有一个看起来像这样的数据集,其中每一行代表一个主题:

score   item1   item2   item3
50     always   never   some
60     some     always  never
70     never    some    always
80     always   never   some
90     some     never   always

我正在尝试创建一个 table 来显示每个级别的每个项目的平均分数(即项目 1 的平均分数,总是?项目 1 的平均分数,一些?)

关于如何修改数据集使其看起来像这样的任何建议:

       item1    item2   item3
always  mean#   mean#   mean#
some    mean#   mean#   mean#
never   mean#   mean#   mean#

谢谢!

这里有一些基本的 R 选项:

  • 使用 stack + tapply
with(
  cbind(score = df$score, stack(df[-1])),
  tapply(score, list(values, ind), mean, na.rm = TRUE)
)

这给出了

        ind
values   item1    item2 item3
  always    65 60.00000    80
  never     70 73.33333    60
  some      75 70.00000    65
  • 使用 lapply + tapply
do.call(
  cbind,
  lapply(df[-1], function(k) tapply(df$score, k, mean, na.rm = TRUE))
)

这给出了

       item1    item2 item3
always    65 60.00000    80
never     70 73.33333    60
some      75 70.00000    65

这是对 tidyrpivot_ 函数的出色使用。

library(tidyr)
library(dplyr) # for the pipe and across
# here is the data
df <- tructure(list(score = c(50, 60, 70, 80, 90), item1 = c("always", 
"some", "never", "always", "some"), item2 = c("never", "always", 
"some", "never", "never"), item3 = c("some", "never", "always", 
"some", "always")), class = c("spec_tbl_df", "tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -5L), spec = structure(list(
    cols = list(score = structure(list(), class = c("collector_double", 
    "collector")), item1 = structure(list(), class = c("collector_character", 
    "collector")), item2 = structure(list(), class = c("collector_character", 
    "collector")), item3 = structure(list(), class = c("collector_character", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1), class = "col_spec"))

df %>%
  pivot_longer(starts_with("item"), values_to = "response") %>%
  pivot_wider(id_cols = response, names_from = name, values_from = score, values_fn = mean)

# A tibble: 3 x 4
  response item1 item2 item3
  <chr>    <dbl> <dbl> <dbl>
1 always      65  60      80
2 never       70  73.3    60
3 some        75  70      65