【问题标题】:Looping over variables in a dataframe循环遍历数据框中的变量
【发布时间】:2018-07-20 09:02:40
【问题描述】:

假设我有一个小数据集:

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)

我已经尝试过循环,但我肯定遗漏了一些明显的东西,因为它不起作用。快速提示将不胜感激。

【问题讨论】:

    标签: r loops


    【解决方案1】:

    您可以使用循环或 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))
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 非常感谢。一个非常聪明的回应。我想要的是一个包含所有响应的巨大矩阵。您的回答让我可以更快地得到它。
      【解决方案3】:
      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))

      【讨论】:

        猜你喜欢
        • 2018-03-07
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多