2017-08-10 109 views
0

假设我有一个名称列表new.var.names <- c("a", "b", "c")。我有一个数据帧DF - 没关系它所包含的内容 - 让我们假设这样的:根据r中的名称列表为名称有效地分配一个新变量

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,而我想创建变量a, b, c。我该如何解决这个问题?

感谢和最诚挚,

桑德

回答

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 
} 

我不明白你为什么要创建三个具有完全相同数据的列,但是你必须有这个原因吗?

+0

啊。谢谢。它虽然不起作用。我收到这样的消息:'错误在'[<-'('* tmp *',,c(v),value = c(2L,1L,1L,1L,2L,1L,1L,: invalid subsetting '(我不想创建完全相同的数据,现在我只是想不到其他的东西......) –

+0

如果您使用自己的示例中的数据,它应该没有错误地工作,请参阅更新 – user3640617

+0

啊,好吧,我测试了你的真实数据答案,这是行不通的,并不意味着它不会在其他情况下使用,无论哪种情况:两种答案对其他人都有用。 ! –

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