遍历每一列和每行,做一些事情

时间:2015-05-07 03:53:16

标签: r dplyr tidyr

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

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并且想要理解为什么这么简单的事情在一种意味着工作的语言中看起来如此复杂有数据。谢谢!

1 个答案:

答案 0 :(得分:6)

这个怎么样:

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会对数据框的整列执行替换。