【问题标题】:Loop through variables with prop.table in R在 R 中使用 prop.table 循环变量
【发布时间】:2018-01-03 20:36:40
【问题描述】:

我有一个简单的问题。我正在尝试遍历一组变量以生成 prop.tables。我只是想直观地检查结果。

这是 mtcars 数据集中的一个毫无意义的示例。

#define loop variables
test <- mtcars
target_var <- c("mpg", "wt")   # targets
group_var <- c("gear", "carb")   # groups to loop through

#loop through combinations of targets and groups, running prop.table
for (i in target_var) {
  for (j in group_var) {

    print(prop.table(table(test$i, test$j), 2))
  }
}

输出为以下 6 个:

<0 x 0 matrix>

我知道我缺少一些基本的东西。

【问题讨论】:

    标签: r loops for-loop


    【解决方案1】:

    我知道您对循环解决方案感兴趣,但我会发布一个tidyverse 方法,您可以在其中将您的函数map 用于变量的每个组合,而不是使用循环。

    test <- mtcars
    target_var <- c("mpg", "wt")
    group_var <- c("gear", "carb")
    
    library(tidyverse)
    
    # get combinations of variables in a dataset
    df1 = expand.grid(target_var, group_var, stringsAsFactors = F)
    
    # apply the function (prop.table etc.) to those combinations
    map2(df1$Var1, df1$Var2, ~prop.table(table(test[, .x], test[, .y]), 2))
    

    这将为您提供一个列表,其中包含您想要作为元素的表格。

    【讨论】:

    • AntoniosK,这太棒了!我以前没有见过这种方法。谢谢。
    【解决方案2】:

    test$i 不起作用。 mtcars 数据框中没有列 i - 运算符 $ 不会解析变量名。您的意思可能是test[i, ]test[, i]

    还请注意,没有名为"3""4" 的列或行,因此对group_var 的迭代不会产生任何意义。

    【讨论】:

    • 然后使用test[, i]test[, j]
    • 这样的:print(prop.table(table(test[, i], test[, j]), 2))
    【解决方案3】:

    正如 Maciej 所提到的,您不能指望 test$i 得到评估,以便将 i 替换为您要提取的列。然而,我们可以使用函数parse_expreval 来控制评估的内容和时间。对您的代码进行微小的更改即可完成这项工作:

    library(tidyverse)
    library(rlang)
    
    #define loop variables
    test <- mtcars
    target_var <- c("mpg", "wt")   # targets
    group_var <- c("gear", "carb")   # groups to loop through
    
    #loop through combinations of targets and groups, running prop.table
    for (i in target_var) {
      for (j in group_var) {
        a <- paste0("test$", i) %>% parse_expr()
        b <- paste0("test$", j) %>% parse_expr()
        print(prop.table(table(eval(a), eval(b)), 2))
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-02
      • 2015-08-10
      • 2020-03-15
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      相关资源
      最近更新 更多