交叉表以在交叉表正文中包含其他 2 个变量

Cross tabulation to include 2 other variables in the body of the crosstab

提问人:Vivek Sharma 提问时间:11/16/2023 更新时间:11/16/2023 访问量:31

问:

请考虑以下数据:

     y b1 b2  M
1  143  1  1  B
2  152  2  1  D
3  199  3  1  A
4  155  4  1  C
5  161  1  2  D
6  166  2  2  B
7  198  3  2  C
8  195  4  2  A
9  193  1  3  A
10 154  2  3  C
11 151  3  3  B
12 150  4  3  D
13 160  1  4  C
14 176  2  4  A
15 159  3  4  D
16 120  4  4  B

我想按 b1 和 b2 交叉制表。表中的每个单元格都应包含 M 和 y 的组合,如下所示:

                  b2
         1       2      3      4
    1  B 143   D 161  A 193  C 160  
b1  2  D 152   B 166  C 154  A 176
    3  A 199   C 198  B 151  D 159
    4  C 155   A 195  D 150  B 120

(我是手工做的,所以希望不会有错误!

在 R 中是否有单行代码可以做到这一点?

R 数据透视表

评论


答:

3赞 Onyambu 11/16/2023 #1

R 不接受多重索引。获得接近问题的最佳方法是使用:reshape

reshape(df, v.names=c("M", "y"), timevar = "b2", dir="wide", idvar = "b1", sep="_")

  b1 M_1 y_1 M_2 y_2 M_3 y_3 M_4 y_4
1  1   B 143   D 161   A 193   C 160
2  2   D 152   B 166   C 154   A 176
3  3   A 199   C 198   B 151   D 159
4  4   C 155   A 195   D 150   B 120

如果您有:tidyverse

library(tidyverse)
pivot_wider(df, names_from = b2, values_from = c(M,y), names_vary = 'slowest')

# A tibble: 4 × 9
     b1 M_1     y_1 M_2     y_2 M_3     y_3 M_4     y_4
  <int> <chr> <int> <chr> <int> <chr> <int> <chr> <int>
1     1 B       143 D       161 A       193 C       160
2     2 D       152 B       166 C       154 A       176
3     3 A       199 C       198 B       151 D       159
4     4 C       155 A       195 D       150 B       120

然后,您可以使用函数强制该列为行名b1column_to_rownames

1赞 Friede 11/16/2023 #2

黑客攻击,容易出错:

x <- xtabs(y ~ b1 + b2 , data = df)
x[seq(nrow(df))] <- with(df, paste(M, y))

> x
   b2
b1  1     2     3     4    
  1 B 143 D 161 A 193 C 160
  2 D 152 B 166 C 154 A 176
  3 A 199 C 198 B 151 D 159
  4 C 155 A 195 D 150 B 120

数据:

df <- read.table(text = "y b1 b2  M
1  143  1  1  B
2  152  2  1  D
3  199  3  1  A
4  155  4  1  C
5  161  1  2  D
6  166  2  2  B
7  198  3  2  C
8  195  4  2  A
9  193  1  3  A
10 154  2  3  C
11 151  3  3  B
12 150  4  3  D
13 160  1  4  C
14 176  2  4  A
15 159  3  4  D
16 120  4  4  B", h = TRUE)