提问人:Vivek Sharma 提问时间:11/16/2023 更新时间:11/16/2023 访问量:31
交叉表以在交叉表正文中包含其他 2 个变量
Cross tabulation to include 2 other variables in the body of the crosstab
问:
请考虑以下数据:
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 中是否有单行代码可以做到这一点?
答:
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
然后,您可以使用函数强制该列为行名b1
column_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)
评论