我有一个数据框,它是一个 ID 变量和一堆日期变量。有很多缺失数据,我想将任何日期值转换为 1,并按原样保留缺失值。我不在乎每个日期实际上是什么;我们使用它们更像是“是否有约会。”
示例 df 和失败的尝试:
df <- data.frame(
id = c("a", "b", "c", "d", "e"),
var_abc = as.Date(c("2020-05-06", NA, "2022-06-03", NA, NA), format = "%Y-%m-%d"),
var_def = as.Date(c(NA, "2023-07-03", "2023-07-08", NA, "2022-04-06"), format = "%Y-%m-%d"),
var_ghi = as.Date(c(NA, NA, NA, "2024-05-05", NA), format = "%Y-%m-%d"),
stringsAsFactors = FALSE
)
var_names <- names(df[ , 2:4])
for (y in var_names) {
df$y <- as.numeric(df$y)
df$y[!is.na(df$y)] <- 1
}
df[, 2:7] <- as.numeric(orders_epic[ , 2:7])
对于循环,我收到此错误:
Error in
$<-.data.frame(
tmp, "y", value = numeric(0)) : replacement has 0 rows, data has 5
。 Google告诉我长度是一个问题,但是length(var_names)
返回3。我也尝试过for (y in names(df[ , 2:4])) { etc.
,但得到了同样的错误。
对于子集,我收到此错误:
Error: 'list' object cannot be coerced to type 'double'
。 Google 告诉我需要将列表更改为向量,但这似乎是一个坏主意,因为它是我的数据框。
此链接告诉我循环名称是一个坏主意,但我的变量名称不像答案那样遵循数字序列。
我考虑过
apply()
变量,但我认为它们仅限于一组选项列表,例如平均值。我认为 grep()
必须搜索一种模式,但我的变量名称不遵循模式。
您可以在循环中使用双括号表示法:
for (y in var_names) {
df[[y]] <- as.numeric(df[[y]])
df[[y]][!is.na(df[[y]])] <- 1
}
现在 R 正在寻找一个字面上名为“y”的列,但该列并不存在。这就是导致错误的原因。