假设我有一个小的数据集:
x1 = c(rep("A",10),rep("B",5),rep("C",20))
x2 = c(rep("D",15),rep("E",7),rep("F",13))
x3 = c(rep("H",20),rep("I",15))
y = c(rep("yes",7),rep("no",20),rep("NA",8))
data1 = data.frame(x1,x2,x3,y)
现在我想遍历变量x1-x3。更准确地说,我想执行以下操作:
prop.table(table(data1$x1,data1$y),margin=2)
prop.table(table(data1$x2,data1$y),margin=2)
prop.table(table(data1$x3,data1$y),margin=2)
我已经尝试过循环,但是我必须缺少明显的东西,因为它不起作用。快速提示将不胜感激。
答案 0 :(得分:4)
您可以使用循环或lapply函数
# Option 1
for(i in 1:3){
print(prop.table(table(data1[,i],data1$y),margin=2))
}
# Option 2
lapply(data1[,-4], function(x) prop.table(table(x,data1$y),margin=2))
答案 1 :(得分:2)
我将在此处给出一个变体,建议将数据堆叠为长格式以进行一次制表。这意味着每个子组的输出表都具有相同的维度:
data1[1:3] <- lapply(data1[1:3], as.character) # only necessary because you have factors
long <- cbind(stack(data1[1:3]), data1[4])
with(long, table(values,y,ind) )
输出:
, , ind = x1
y
values NA no yes
A 0 3 7
B 0 5 0
C 8 12 0
D 0 0 0
E 0 0 0
F 0 0 0
H 0 0 0
I 0 0 0
, , ind = x2
y
values NA no yes
A 0 0 0
B 0 0 0
C 0 0 0
D 0 8 7
E 0 7 0
F 8 5 0
H 0 0 0
I 0 0 0
, , ind = x3
y
values NA no yes
A 0 0 0
B 0 0 0
C 0 0 0
D 0 0 0
E 0 0 0
F 0 0 0
H 0 13 7
I 8 7 0
答案 2 :(得分:0)
Map(function(x)prop.table(table(x,data1$y),margin=2),data1[-4])
$`x1`
x NA no yes
A 0.00 0.15 1.00
B 0.00 0.25 0.00
C 1.00 0.60 0.00
$x2
x NA no yes
D 0.00 0.40 1.00
E 0.00 0.35 0.00
F 1.00 0.25 0.00
$x3
x NA no yes
H 0.00 0.65 1.00
I 1.00 0.35 0.00
或者您可以使用
lapply(data1[-4],function(x)prop.table(table(x,data1$y),margin=2))