【发布时间】: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