2012-12-20 94 views
1

我认为这可能是一个非常简单的问题,但是我不能在我的生活中在线或在我一直用来学习R的书中找到答案。使用R中的for循环中的对象创建变量名称

我正在尝试创建一个表,其中包含一个基于现有矩阵向量中值的变量。这里是(命名为“阈值”),我使用在变量名appears-

varname  threshold_1_name threshold_1_value 
1 BMXBMI high    25 
2 BMXCALF low    40 
3 BMXHT high    180 
4 BMXLEG low    40 
5 BMXSUB high    32 
6 BMXTHICR high    65 

表有81条记录,而我想要做的事的载体或兴趣如何出现在表中的例子像这样:

for (i in 1:81) { 
    varname1 <- paste(thresholds$varname[i], thresholds$threshold_1_name[i], sep = "_") 
    newtable$[varname1] <- ifelse((bigTable$[thresholds$varname[i]] < thresholds$threshold_1_value[i]),1,0) 
} 

这将创建 'newtable的' 与81列有姓名,其中前六列将被命名为BMXBMI_high,BMXCALF_low,BMXHT_high,BMXLEG_low,BMXSUB_high,BMXTHICR_high。我的ifelse语句似乎很好 - 我在循环之外测试了它,并且它工作正常。我想我使用不正确的语法来创建变量名称。

任何意见我应该做什么或我应该如何搜索答案将不胜感激。我认为我无法找到答案的一部分是因为我使用了不正确的词汇/搜索术语。谢谢!

@本 - 你似乎已经预测,我没有问题,我的ifelse线。以下是bigTable的示例(并且我在上面的'阈值'示例中添加了一列),以帮助您提供有关如何对问题进行排序的一些建议。我试图代码值的新变量为0/1,根据Bigtable中的值是否高于或低于“阈值”

BigTable的样本值:

BMXHT BMXBMI BMXLEG BMXCALF BMXWAIST BMXTHICR BMXTRI BMXSUB 
1 174.0 24.90  NA 37.5  98.0  NA 12.8 20.4 
2 178.3 29.10 45.2 42.6  99.9  56.2 17.4 38.6 
3 162.0 22.56 39.7 34.0  81.6  47.0 20.3 16.8 
4 162.9 29.39 43.0 37.2  90.7  55.7 26.4 34.2 
5 190.1 30.94 46.6 43.7 108.0  64.0 15.5 26.6 
6 180.0 30.62 46.0 40.5 112.8  57.1 26.2 NA 

当我试图在一行代码中,我不断收到一个错误,说代码只是读取第一个条目,所以我现在正在尝试下面的代码段,它既非常低效,又不工作(前两行是你以前的代码发送) -

varname1 <- paste(thresholds$varname, thresholds$threshold_1_name, sep = "_") 
bigTable[varname1[1:5]] <- NA 

for (i in 1:5) { 
    value <- thresholds$threshold_1_value[i] 
    var <- thresholds$varname[i] 
    newvar <- varname1[i] 
    for(j in 1:10) { 
    if(bigTable[var[j]] > value) {bigTable[newvar] = 1} 
    else if (bigTable[var[j]] <= value) {bigTable[newvar] = 0} 
    } 
} 

再次,任何帮助,您可以提供非常感谢!

+0

如何'varname1 [I]'和'$ newtable中的varname1'varname1'和[I]''而不是$ newtable的[varname1]'在循环分配的LHS? – Ben

+0

你也可以发布'bigTable'。有更快的方法来做到这一点,但你也需要理解'$'和'[[''之间的区别。看看'?Extract'。 – mnel

回答

2

下面是'如何使用数据框中的变量向数据框添加多列'这个问题的答案,这似乎是原始问题的一部分(在我们看到什么后才能做其他事情bigTable样子):

# prepare data 
thresholds <- read.table(text = "varname  threshold_1_name 
    BMXBMI high 
    BMXCALF low 
    BMXHT high 
    BMXLEG low 
    BMXSUB high 
BMXTHICR high", header = TRUE) 

追求循环的问题,我们可以用它基于现有数据

varname1 <- NULL 
for (i in 1:nrow(thresholds) { 
    varname1[i] <- paste(thresholds$varname[i], thresholds$threshold_1_name[i], sep = "_") 
} 

创建新的列名,但请注意,在这里不需要一个循环,一个基本的矢量操作将得到与循环相同的结果:

varname1 <- paste(thresholds$varname, thresholds$threshold_1_name, sep = "_") 

无论如何,你做任何一个方式,那么你可以为列名,像这样添加名称:

# add new columns to a new dataframe 
newtable <- data.frame(setNames(replicate(length(varname1), numeric(0), simplify = F), varname1)) 

而这里的输出,新列与被现有变量的函数名:

str(newtable) 
'data.frame': 0 obs. of 6 variables: 
$ BMXBMI_high : num 
$ BMXCALF_low : num 
$ BMXHT_high : num 
$ BMXLEG_low : num 
$ BMXSUB_high : num 
$ BMXTHICR_high: num 
+0

列不应该添加到'thresholds',它们应该被添加到一个名为'newtable'的新表中。:) –

+0

@ Ben-我刚刚编辑了上面的帖子以包含bigTable的示例。任何帮助,您可以提供非常感谢。 –

+0

@Anthony Damico,谢谢,我已经更新了我的答案。 – Ben