遍历数据框中的变量

时间:2018-07-19 23:41:09

标签: r loops

假设我有一个小的数据集:

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)

我已经尝试过循环,但是我必须缺少明显的东西,因为它不起作用。快速提示将不胜感激。

3 个答案:

答案 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))