我正在尝试生成一些 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
在我看来,填充步骤非常笨拙/低效。有什么建议吗?谢谢!
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