首页 > 解决方案 > R数据框中的交叉制表

问题描述

我在 R 中有一个数据框:

Subject  T  O  E  P  Score
1        0  1  0  1   256
2        1  0  1  0   325 
2        0  1  0  1   125
3        0  1  0  1   27
4        0  0  0  1   87
5        0  1  0  1   125
6        0  1  1  1   100

这只是数据框的显示。实际上,每个科目我都有很多台词。但是科目只有1到6

对于每个主题,可能的值为:

我想创建一个新的数据框,其中包含 6 行(每个主题一个)和每个组合的计算 MEAN 分数:

T、O、E、P、TO、TE、TP、OE、OP、PE、TOP、TOE、POE、PET

以上将是新数据框的列。

最终输出应如下所示

Subject  T    O   E   P   TO  TE  TP   OE   OP  PE  TOP  TOE  POE  PET
1       
2
3
4
5
6

对于这些行 x 列中的每一行,其值为 MEAN SCORE

我试过了aggregatetable但我似乎无法得到我想要的

对不起,我是 R 新手

谢谢

标签: rstatistics

解决方案


我不得不重建样本数据来回答我理解的问题,告诉我它是否适合你:

set.seed(2)
df <- data.frame(subject=sample(1:3,9,T),
                 T = sample(c(0,1),9,T),
                 O = sample(c(0,1),9,T),
                 E = sample(c(0,1),9,T),
                 P = sample(c(0,1),9,T),
                 score=round(rnorm(9,10,3)))

#   subject T O E P score
# 1       1 1 0 0 1    12
# 2       3 1 0 1 0     9
# 3       2 0 1 0 1    13
# 4       1 1 0 0 0     3
# 5       3 0 1 0 1    14
# 6       3 0 0 1 0    13
# 7       1 1 0 1 0    17
# 8       3 1 0 1 0    12
# 9       2 0 0 1 1    14

cols1 <- c("T","O","E","P")
df$comb <- apply(df[cols1],1,function(x) paste(names(df[cols1])[as.logical(x)],collapse=""))

#   subject T O E P score comb
# 1       1 1 0 0 1    12   TP
# 2       3 1 0 1 0     9   TE
# 3       2 0 1 0 1    13   OP
# 4       1 1 0 0 0     3    T
# 5       3 0 1 0 1    14   OP
# 6       3 0 0 1 0    13    E
# 7       1 1 0 1 0    17   TE
# 8       3 1 0 1 0    12   TE
# 9       2 0 0 1 1    14   EP

library(tidyverse)

df %>%
  group_by(subject,comb) %>%
  summarize(score=mean(score)) %>%
  spread(comb,score) %>%
  ungroup

# # A tibble: 3 x 7
#   subject     E    EP    OP     T    TE    TP
# *   <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1       1    NA    NA    NA     3  17.0    12
# 2       2    NA    14    13    NA    NA    NA
# 3       3    13    NA    14    NA  10.5    NA

基础 R 中的第二步:

means <- aggregate(score ~ subject + comb,df,mean)
means2 <- reshape(means,timevar="comb",idvar="subject",direction="wide")
setNames(means2,c("subject",sort(unique(df$comb))))
#   subject  E EP OP  T   TE TP
# 1       3 13 NA 14 NA 10.5 NA
# 2       2 NA 14 13 NA   NA NA
# 5       1 NA NA NA  3 17.0 12

推荐阅读