假设我有一个名单new.var.names <- c("a", "b", "c")
列表。我有一个数据帧DF - 它包含什么并不重要 - 让我们假设:
StudyID <- c('sid124','sid66537','sid78848')
age <- c(87, 63, 45)
bmi <- c(24.3,19.2,23.5)
data <- data.frame(StudyID, age, bmi)
现在我想添加新变量并将其名称基于列表new.var.names
。我会做类似的事情:
data$NewVar <- data$bmi/data$age
但是我想创建多个新变量,所以天真地我会像这样创建它们:
data$a <- data$bmi/data$age
data$b <- data$bmi/data$age
data$c <- data$bmi/data$age
显然这没有效率,因为在现实世界中我的列表相当长 - 数百个项目。所以我想做点什么:
for (v in new.var.names){
data$v <- data$bmi/data$age
}
但这不起作用 - 我已经尝试了,不知何故我知道它不会因此发布:-P - 因为它创建变量v
,而我想创建变量{{1 }}。我怎么做到这一点?
谢谢,最好,
桑德
答案 0 :(得分:2)
我想你可以这样做:
更新:从问题中复制和粘贴数据以显示其有效
StudyID <- c('sid124','sid66537','sid78848')
age <- c(87, 63, 45)
bmi <- c(24.3,19.2,23.5)
data <- data.frame(StudyID, age, bmi)
data$NewVar <- data$bmi/data$age
new.var.names <- c("a", "b", "c")
for (v in new.var.names){
data[,c(v)] <- data$bmi/data$age
}
我不明白为什么你要创建具有完全相同数据的三列,但你必须有这个理由吗?
答案 1 :(得分:0)
我可能找到了答案:
for (v in 1:length(new.var.names)){
print(new.var.names[v]) # these are just for debugging/sanity check
data[[ new.var.names[v] ]] <- data$bmi/data$age
print(table(data[[ new.var.names[v] ]])) # these are just for debugging/sanity check
}
真棒!感谢您的帮助@ user3640617