有没有一种方法可以获得R中不同列的频率分布

is there a method to get frequency distribution different columns in R

数据为:

df1<-read.table(text=" Car1 Car2 Car3 Group1 Group2 Group3 Code1 Code2 Code3
N M M A A A B B B
Q M M B B A A A B
Q N Q A A B A B B
N P P A A A A B A
N M Q A B A B A A
M Q P B A A B B A
N M N B A A A B A
N N M B B B A B A
Q Q P A B B B A A
N Q M A B A B A A
",header=TRUE)

我想让 tables 显示 Group1 和 Code 1 与 Car1,Group2 和 Code 2 与 Car2 和 Group3 以及 Code 3 与 Car3 对于 Group1 和带有 Car1 的代码 1,我会得到 Car1 的以下 table:

Car1 Car_A Car_B Group_A Group_B
M    M     0     1       0       1
N    N     4     2       3       3
Q    Q     2     1       2       1

我想循环获取 3 tables 使用例如 lapply.

我已经试过了,但是我没有得到 tables

df2<-lapply(1:3, function(i) as.data.frame.matrix(table(paste0('Car', i, ' ~ ', 'Group', i)), data = df1))

您可以使用 lapply,正如您在问题中已经显示的那样。

lapply(1:3, function(i) cbind(
    table(df1[,c(paste0('Car', i), paste0('Group', i))])
  , table(df1[,c(paste0('Car', i), paste0('Code', i))])))
#[[1]]
#  A B A B
#M 0 1 0 1
#N 4 2 3 3
#Q 2 1 2 1
#
#[[2]]
#  A B A B
#M 2 2 2 2
#N 1 1 0 2
#P 1 0 0 1
#Q 1 2 2 1
#
#[[3]]
#  A B A B
#M 3 1 2 2
#N 1 0 1 0
#P 2 1 3 0
#Q 1 1 1 1

还有名字。

lapply(1:3, function(i) {
    t1 <- table(df1[,c(paste0('Car', i), paste0('Group', i))])
    t2 <- table(df1[,c(paste0('Car', i), paste0('Code', i))])
    dimnames(t1) <- lapply(1:2, function(i) paste(names(dimnames(t1))[i], dimnames(t1)[[i]], sep="_"))
    dimnames(t2) <- lapply(1:2, function(i) paste(names(dimnames(t2))[i], dimnames(t2)[[i]], sep="_"))
    cbind(t1, t2)
})
#[[1]]
#       Group1_A Group1_B Code1_A Code1_B
#Car1_M        0        1       0       1
#Car1_N        4        2       3       3
#Car1_Q        2        1       2       1
#
#[[2]]
#       Group2_A Group2_B Code2_A Code2_B
#Car2_M        2        2       2       2
#Car2_N        1        1       0       2
#Car2_P        1        0       0       1
#Car2_Q        1        2       2       1
#
#[[3]]
#       Group3_A Group3_B Code3_A Code3_B
#Car3_M        3        1       2       2
#Car3_N        1        0       1       0
#Car3_P        2        1       3       0
#Car3_Q        1        1       1       1

或者更改 df1

的解决方案
df1 <- as.data.frame(sapply(names(df1)
  , function(i) paste(i ,df1[,i], sep="_")))
lapply(1:3, function(i) cbind(
    table(df1[,c(paste0('Car', i), paste0('Group', i))])
  , table(df1[,c(paste0('Car', i), paste0('Code', i))])))
#[[1]]
#       Group1_A Group1_B Code1_A Code1_B
#Car1_M        0        1       0       1
#Car1_N        4        2       3       3
#Car1_Q        2        1       2       1
#
#[[2]]
#       Group2_A Group2_B Code2_A Code2_B
#Car2_M        2        2       2       2
#Car2_N        1        1       0       2
#Car2_P        1        0       0       1
#Car2_Q        1        2       2       1
#
#[[3]]
#       Group3_A Group3_B Code3_A Code3_B
#Car3_M        3        1       2       2
#Car3_N        1        0       1       0
#Car3_P        2        1       3       0
#Car3_Q        1        1       1       1