在 R 中生成 2 向和 3 向交叉表

问题描述 投票:0回答:1

我正在尝试生成一些 2 路和 3 路频率表。我相信一定有一种更有效的方法来增加频率。这是一个 2 向表示例:

# create 10 x 5 zero-cell table
n_row = 10; n_col = 5
row_labs = paste('A', toupper(letters[1:n_row]), sep='')
col_labs = paste('B', toupper(letters[1:n_col]), sep='')
crosstbl = as.table(matrix(0, nrow=n_row, ncol=n_col,
    dimnames=list(row_labs, col_labs)))

#  populate with some numbers
crosstbl[1,1]= 10
crosstbl[1,2]= 20
crosstbl[1,3]= 30
crosstbl[1,4]= 15
crosstbl[1,5]= 10
for (j in 1:5) {
    crosstbl[2,j]=2*crosstbl[1,j]
    crosstbl[3,j]=3*crosstbl[1,j]
    crosstbl[4,j]=4*crosstbl[1,j]
    crosstbl[5,j]=2*crosstbl[1,j]
    crosstbl[6,j]=1*crosstbl[1,j]
    crosstbl[7,j]=2*crosstbl[1,j]
    crosstbl[8,j]=3*crosstbl[1,j]
    crosstbl[9,j]=2*crosstbl[1,j]
    crosstbl[10,j]=2*crosstbl[1,j]
}
crosstbl[2,5]=200
crosstbl[4,3]=200
crosstbl[7,1]=100
crosstbl[2,3]=200
crosstbl[4,1]=100
crosstbl[7,3]=200
crosstbl[2,2]=100
crosstbl[4,4]=200
crosstbl[7,5]=100

crosstbl
#     BA  BB  BC  BD  BE
# AA  10  20  30  15  10
# AB  20 100 200  30 200
# AC  30  60  90  45  30
# AD 100  80 200 200  40
# AE  20  40  60  30  20
# AF  10  20  30  15  10
# AG 100  40 200  30 100
# AH  30  60  90  45  30
# AI  20  40  60  30  20
# AJ  20  40  60  30  20

那么,类似地,这将是一个三向示例:

# create 10 x 5 x 3 zero-cell table
n_row = 10; n_col = 5; n_slice = 3
row_labs = paste('A', toupper(letters[1:n_row]), sep='')
col_labs = paste('B', toupper(letters[1:n_col]), sep='')
slice_labs = paste('S', toupper(letters[1:n_slice]), sep='')
crosstbl = as.table(array(0, dim=c(n_row, n_col, n_slice),
    dimnames=list(row_labs, col_labs, slice_labs)))

# populate with some numbers
crosstbl[1,1,1]= 10
crosstbl[1,2,1]= 20
crosstbl[1,3,1]= 30
crosstbl[1,4,1]= 15
crosstbl[1,5,1]= 10
crosstbl[1,1,2]= 20
crosstbl[1,2,2]= 30
crosstbl[1,3,2]= 10
crosstbl[1,4,2]= 10
crosstbl[1,5,2]= 15
crosstbl[1,1,3]= 10
crosstbl[1,2,3]= 10
crosstbl[1,3,3]= 20
crosstbl[1,4,3]= 10
crosstbl[1,5,3]= 10
for (j in 1:5) {
    crosstbl[2,j,1]=2*crosstbl[1,j,1]
    crosstbl[3,j,1]=3*crosstbl[1,j,1]
    crosstbl[4,j,1]=4*crosstbl[1,j,1]
    crosstbl[5,j,1]=2*crosstbl[1,j,1]
    crosstbl[6,j,1]=1*crosstbl[1,j,1]
    crosstbl[7,j,1]=2*crosstbl[1,j,1]
    crosstbl[8,j,1]=3*crosstbl[1,j,1]
    crosstbl[9,j,1]=2*crosstbl[1,j,1]
    crosstbl[10,j,1]=2*crosstbl[1,j,1]
    crosstbl[2,j,2]=1*crosstbl[1,j,2]
    crosstbl[3,j,2]=2*crosstbl[1,j,2]
    crosstbl[4,j,2]=2*crosstbl[1,j,2]
    crosstbl[5,j,2]=4*crosstbl[1,j,2]
    crosstbl[6,j,2]=3*crosstbl[1,j,2]
    crosstbl[7,j,2]=1*crosstbl[1,j,2]
    crosstbl[8,j,2]=1*crosstbl[1,j,2]
    crosstbl[9,j,2]=3*crosstbl[1,j,2]
    crosstbl[10,j,2]=2*crosstbl[1,j,2]
    crosstbl[2,j,3]=1*crosstbl[1,j,3]
    crosstbl[3,j,3]=1*crosstbl[1,j,3]
    crosstbl[4,j,3]=1*crosstbl[1,j,3]
    crosstbl[5,j,3]=4*crosstbl[1,j,3]
    crosstbl[6,j,3]=4*crosstbl[1,j,3]
    crosstbl[7,j,3]=3*crosstbl[1,j,3]
    crosstbl[8,j,3]=2*crosstbl[1,j,3]
    crosstbl[9,j,3]=1*crosstbl[1,j,3]
    crosstbl[10,j,3]=1*crosstbl[1,j,3]
}
crosstbl[2,5,1]=200
crosstbl[4,3,1]=200
crosstbl[7,1,1]=100
crosstbl[2,3,1]=200
crosstbl[4,1,1]=100
crosstbl[7,3,1]=200
crosstbl[2,2,1]=100
crosstbl[4,4,1]=200
crosstbl[7,5,1]=100
crosstbl[2,5,2]=100
crosstbl[4,3,2]=100
crosstbl[7,1,2]=200
crosstbl[2,3,2]=100
crosstbl[4,1,2]=200
crosstbl[7,3,2]=100
crosstbl[2,2,2]=200
crosstbl[4,4,2]=100
crosstbl[7,5,2]=200
crosstbl[2,5,3]=100
crosstbl[4,3,3]=100
crosstbl[7,1,3]=300
crosstbl[2,3,3]=100
crosstbl[4,1,3]=100
crosstbl[7,3,3]=300
crosstbl[2,2,3]=300
crosstbl[4,4,3]=100
crosstbl[7,5,3]=200

crosstbl
# , , SA
# 
#     BA  BB  BC  BD  BE
# AA  10  20  30  15  10
# AB  20 100 200  30 200
# AC  30  60  90  45  30
# AD 100  80 200 200  40
# AE  20  40  60  30  20
# AF  10  20  30  15  10
# AG 100  40 200  30 100
# AH  30  60  90  45  30
# AI  20  40  60  30  20
# AJ  20  40  60  30  20
# 
# , , SB
# 
#     BA  BB  BC  BD  BE
# AA  20  30  10  10  15
# AB  20 200 100  10 100
# AC  40  60  20  20  30
# AD 200  60 100 100  30
# AE  80 120  40  40  60
# AF  60  90  30  30  45
# AG 200  30 100  10 200
# AH  20  30  10  10  15
# AI  60  90  30  30  45
# AJ  40  60  20  20  30
# 
# , , SC
# 
#     BA  BB  BC  BD  BE
# AA  10  10  20  10  10
# AB  10 300 100  10 100
# AC  10  10  20  10  10
# AD 100  10 100 100  10
# AE  40  40  80  40  40
# AF  40  40  80  40  40
# AG 300  30 300  30 200
# AH  20  20  40  20  20
# AI  10  10  20  10  10
# AJ  10  10  20  10  10

在我看来,填充步骤非常笨拙/低效。有什么建议吗?谢谢!

r pivot-table
1个回答
1
投票

xtabs

set.seed(42)
dat <- data.frame(V1 = sample(c("AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ"), 1000, replace=TRUE), V2=sample(c("BA","BB","BC","BD","BE"), 1000, replace=TRUE), V3=sample(c("S1","S2","S3"), 1000, replace=TRUE))
head(dat)
#   V1 V2 V3
# 1 AA BB S2
# 2 AE BB S1
# 3 AA BC S1
# 4 AI BE S3
# 5 AJ BB S1
# 6 AD BD S1
xtabs(~ V1 + V2 + V3, data = dat)
# , , V3 = S1
#     V2
# V1   BA BB BC BD BE
#   AA  3  4  9 10  5
#   AB  9  8  7  9  6
#   AC  4  4 10  6 10
#   AD  9  5  9  4  7
#   AE  5  9  8  9  4
#   AF  8  7  7  6  6
#   AG  6  7 11  6 11
#   AH  8  6  8  6  4
#   AI  7 10  6  7  1
#   AJ  9 12  9  5  5
# , , V3 = S2
#     V2
# V1   BA BB BC BD BE
#   AA  5  5 11  8 10
#   AB  7  3  6  5 12
#   AC  9  4  8  8 11
#   AD  8 12  1  5  6
#   AE  5  9  6  7  5
#   AF  8  8  2  8  7
#   AG  4  6  5  4  4
#   AH  5 10  7  9  4
#   AI  6  5 11  4  3
#   AJ  9  9  8  8  6
# , , V3 = S3
#     V2
# V1   BA BB BC BD BE
#   AA  6  8  5 10 12
#   AB  4  6  6  7  7
#   AC  2  7  5  6  7
#   AD  1  5  5 10  2
#   AE  5  6  8  5  4
#   AF  9  2  5  8  4
#   AG  4  2  5  8  6
#   AH  4  6  8 10  4
#   AI 11  3  7  7  8
#   AJ 12  6  3  7 15
© www.soinside.com 2019 - 2024. All rights reserved.