我认为这是描述我想做的最好的方式:
df$column <- ifelse(is.na(df$column) == TRUE, 0, 1)
Run Code Online (Sandbox Code Playgroud)
但是列是动态的.这是因为我有大约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)
}
}
Run Code Online (Sandbox Code Playgroud)
我可以用其他语言(甚至是Excel)快速完成这项工作,但我只是在学习R并且想要理解为什么这么简单的东西在一种用于处理数据的语言中看起来如此复杂.谢谢!
这个怎么样:
df.new = as.data.frame(lapply(df, function(x) ifelse(is.na(x), 0, 1)))
Run Code Online (Sandbox Code Playgroud)
lapply将函数应用于数据框的每一列df.在这种情况下,该功能进行0/1替换.lapply返回一个列表.将其包装在as.data.frame将列表转换为数据框(这是一种特殊类型的列表)中.
在R你经常可以用一个*apply函数系列替换一个循环.在这种情况下,lapply在数据帧的列上"循环".此外,许多R函数是"向量化"的,这意味着函数一次对向量中的每个值进行操作.在这种情况下,ifelse是否对数据帧的整列进行替换.