【问题标题】:Is there a way to make this R for loop work有没有办法让这个 R for 循环工作
【发布时间】:2021-02-08 15:52:09
【问题描述】:

我正在寻找一种简单的方法来遍历我的数据并根据条件打印出某些列。 这个 for 循环应该在数据中找到满足 if 条件的列,然后打印出这些列。这是我尝试过的。

for (var in names(df)) {
    if(length (unique(df[var])) == 2) {
       print (var)
      }
}

【问题讨论】:

    标签: r for-loop if-statement


    【解决方案1】:

    你需要使用双括号:

    for (var in names(df)) {
      if(length (unique(df[[var]])) == 2) {
        print(var)
      }
    }
    

    这有点棘手。但是R 在内部将 data.frames 存储为一个列表,并且单括号索引给出了一个带有 1 列的 data.frame。并且将length 应用于 data.frame 会返回其列数。 更实用的方法是

    uniqueElementCount <- vapply(X = df,FUN = function(columnValues) {length(unique(columnValues))}, FUN.VALUE = double(1))
    names(df)[uniqueElementCount  == 2]
    

    【讨论】:

    • 嘿,谢谢乔纳斯,忘了上面的双括号,这行得通。
    【解决方案2】:

    您可以在此处尝试使用apply 函数来获得矢量化解决方案:

    idx <- sapply(names(df), function(x) length(unique(df[, x])) == 2)
    names(df)[idx]
    

    idx 向量将被分配一个布尔 T/F,具体取决于数据框中的每个特定列是否匹配长度/唯一检查。然后,我们可以简单地使用这个布尔向量对数据框的原始名称进行子集化,以查看所有匹配的列名。

    【讨论】:

      【解决方案3】:

      在 R 中,你应该避免使用“for”循环,在大数据集中循环很慢。 考虑使用 lapply:

      columns <- lapply(df, function(var) {
        length(unique(var)) == 2
      })
      

      无论如何,您的代码的问题是您没有尝试在列上对 df 进行子集化,您可以将 df[var] 替换为 df[, var]

      【讨论】:

      • 刚刚发现这个 - lappy/Sappy 功能,但感谢您的建议
      猜你喜欢
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多