遍历每一列和每一行,做一些事情
Loop through each column and row, do stuff
我认为这是描述我想做的事情的最佳方式:
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 并且想了解为什么如此简单的东西在一种本来可以工作的语言中看起来如此复杂与数据。谢谢!
这个怎么样:
df.new = as.data.frame(lapply(df, function(x) ifelse(is.na(x), 0, 1)))
lapply
对数据框 df
的每一列应用一个函数。在这种情况下,函数执行 0/1 替换。 lapply
returns 一个列表。将其包装在 as.data.frame
中会将列表转换为数据框(这是一种特殊类型的列表)。
在 R
中,您通常可以用 *apply
函数族之一替换循环。在这种情况下,lapply
"loops" 在数据框的列上。此外,许多 R
函数是 "vectorized",这意味着该函数同时对向量中的每个值进行运算。在这种情况下,ifelse
对数据框的整个列进行替换。
我认为这是描述我想做的事情的最佳方式:
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 并且想了解为什么如此简单的东西在一种本来可以工作的语言中看起来如此复杂与数据。谢谢!
这个怎么样:
df.new = as.data.frame(lapply(df, function(x) ifelse(is.na(x), 0, 1)))
lapply
对数据框 df
的每一列应用一个函数。在这种情况下,函数执行 0/1 替换。 lapply
returns 一个列表。将其包装在 as.data.frame
中会将列表转换为数据框(这是一种特殊类型的列表)。
在 R
中,您通常可以用 *apply
函数族之一替换循环。在这种情况下,lapply
"loops" 在数据框的列上。此外,许多 R
函数是 "vectorized",这意味着该函数同时对向量中的每个值进行运算。在这种情况下,ifelse
对数据框的整个列进行替换。