根据r中的名称列表有效地为新变量分配名称

时间:2017-08-10 21:28:05

标签: r

假设我有一个名单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 }}。我怎么做到这一点?

谢谢,最好,

桑德

2 个答案:

答案 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