【问题标题】:Create new columns in data table with for loop使用 for 循环在数据表中创建新列
【发布时间】:2018-10-10 16:39:50
【问题描述】:

有没有一种简单的方法可以在 for 循环中创建列?我知道这个问题已经在这里被问过很多次了,我已经尝试过这个解决方案来适应我的情况

for (i in 1:100) {
  eval(parse(text = paste0('a$colum', i, ' <- whatever_you_want_your_column_to_contain')))
}

来自其中一篇文章,但没有帮助。我有一个现有的数据表数据,我试图在 for 循环中创建列 P_1 到 P_30,然后将它们分配为 NULL(我只是想预先定义这些列)。我试过这个:

for (i in 1:30) {
  eval(parse(text = paste0('data$P_', i, ' <- NULL')))
}

但没有任何成功。您能否建议任何可行的方法?

一个相关问题 - 如何在另一个循环中引用这些列,如果我再次有列 P_i,其中 i 从 1 到 30,如何在循环中引用 data$P_i?

编辑:

我有这张数据表做个例子:

customer_id <- c("1","1","1","2","2","2","2","3","3","3")
account_id <- as.character(c(11,11,11,55,55,55,55,38,38,38))
obs_date <- c(as.Date("2017-01-01","%Y-%m-%d"), as.Date("2017-02-01","%Y-%m-%d"), as.Date("2017-03-01","%Y-%m-%d"),
              as.Date("2017-12-01","%Y-%m-%d"), as.Date("2018-01-01","%Y-%m-%d"), as.Date("2018-02-01","%Y-%m-%d"),
              as.Date("2018-03-01","%Y-%m-%d"), as.Date("2018-04-01","%Y-%m-%d"), as.Date("2018-05-01","%Y-%m-%d"),
              as.Date("2018-06-01","%Y-%m-%d"))
variable <- c(87,90,100,120,130,150,12,13,15,14)    
data <- data.table(customer_id,account_id,obs_date,variable)

我发现问题实际上在于将 NULL 分配给这些列,因为当我根据帖子的建议执行此操作时:

for (i in 1:30) {
   eval(parse(text = paste0('data$P_', i, ' <- 1')))
}

它确实有效,只是使用 NULL 而不是 1 它没有。所以,这不是一个坏建议,它只是不适用于 NULL。

【问题讨论】:

  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。 Data.frames 真的不喜欢 NULL 列,它们应该是零长度向量。
  • 您真的在处理 data.table 吗?似乎您“只有”一个data.frame。另外,你真的应该学习 help("[[").
  • 请提供您所指帖子的链接。我有强烈的反对它的冲动,让其他人知道它包含不好的建议。
  • 推荐 eval/parse 和循环处理数据并不是一个好建议。如果要填1,可以data.frame(Map(function(x) 1, paste0("P_", 1:30)))
  • @Roland 这是提出该建议的答案,到目前为止,以某种方式受到好评:stackoverflow.com/a/29400819

标签: r for-loop data.table


【解决方案1】:

这是data.table 的答案 - 我认为你很接近,只是没有正确的语法将列附加到数据表:

for (i in 1:30) {
  data[, paste0("P_", i) := "whatever_you_want_your_column_to_contain"]
}

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多