【问题标题】:Loop through each column and row, do stuff循环遍历每一列和每一行,做一些事情
【发布时间】:2015-07-17 11:13:18
【问题描述】:

我认为这是描述我想做的最好的方式:

df$column <- ifelse(is.na(df$column) == TRUE, 0, 1)

但是列是动态的。这是因为我有大约 45 列都具有相同的内容,我要做的就是检查每个单元格,如果其中有内容,则将其替换为 1,如果没有,则替换为 0。我当然尝试了很多不同的东西,但由于 R 中似乎没有 df[index][column],我迷路了。我本来希望这样的事情能奏效,但没有:

for (index in df) {
  for (column in names(df)) {
    df[[index]][[column]] <- ifelse(is.na(df[[index]][[column]]) == TRUE, 0, 1)
  }
}

我可以用其他语言(甚至 Excel)快速做到这一点,但我只是在学习 R,并想了解为什么如此简单的事情在用于处理数据的语言中似乎如此复杂。谢谢!

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    这个怎么样:

    df.new = as.data.frame(lapply(df, function(x) ifelse(is.na(x), 0, 1)))
    

    lapply 对数据框df 的每一列应用一个函数。在这种情况下,该函数执行 0/1 替换。 lapply 返回一个列表。将其包装在 as.data.frame 中会将列表转换为数据框(这是一种特殊类型的列表)。

    R 中,您通常可以将循环替换为*apply 系列函数之一。在这种情况下,lapply 在数据框的列上“循环”。此外,许多R 函数是“矢量化”的,这意味着该函数一次对向量中的每个值进行操作。在这种情况下,ifelse 对数据框的整个列进行替换。

    【讨论】:

    • 完美,谢谢!这正是我所需要的。只是想知道,有没有办法检查你在函数内部时所在的列或行?还是标准做法是首先选择要操作的数据并在其上使用 lapply?再次感谢。
    • 啊,明白了:df[2:44] = as.data.frame(lapply(df[2:44], function(x) ifelse(is.na(x), 0, 1)))
    猜你喜欢
    • 1970-01-01
    • 2012-05-08
    • 2020-04-06
    • 1970-01-01
    • 2018-06-18
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多