是否有一种方法可以获取R中不同列的频率分布

时间:2019-12-05 10:16:41

标签: r loops lapply frequency-distribution

数据为:

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)

我想获取显示Car1的Group1和Code 1,Car2的Group2和Code 2以及Car3的Group3和Code 3的表格 对于Car1的Group1和代码1,我将获得Car1的下表:

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

我想循环使用例如lapply获得3个表。

我已经尝试过了,但是我无法获取表格

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

1 个答案:

答案 0 :(得分:1)

您可以使用问题中已经显示的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