R:循环变量名

问题描述 投票:0回答:1

我有一个数据框,它是一个 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()
必须搜索一种模式,但我的变量名称不遵循模式。

r loops for-loop
1个回答
0
投票

您可以在循环中使用双括号表示法:

for (y in var_names) {
  df[[y]] <- as.numeric(df[[y]])
  df[[y]][!is.na(df[[y]])] <- 1
}

现在 R 正在寻找一个字面上名为“y”的列,但该列并不存在。这就是导致错误的原因。

© www.soinside.com 2019 - 2024. All rights reserved.