使用R中for循环中的对象创建变量名称

时间:2012-12-20 22:20:58

标签: r

我认为这可能是一个非常简单的问题,但我不能在网上或在我用来学习R的书中找到答案。

我正在尝试创建一个表,其中的变量基于现有矩阵的向量中的值命名。下面是一个例子,说明我在变量名称出现时使用的表格(名为“阈值”)中的矢量或兴趣如何出现 -

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)
}

将创建具有81个列的'newtable',其中前六列将命名为BMXBMI_high,BMXCALF_low,BMXHT_high,BMXLEG_low,BMXSUB_high,BMXTHICR_high。我的ifelse声明似乎很好 - 我在循环之外测试它并且它起作用。我想我使用不正确的语法来创建变量名。

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

@ Ben-正如你似乎预测的那样,我的ifelse系列没有问题。以下是bigTable的示例(我在上面的'阈值'示例中添加了一列),以帮助您提供有关如何对问题进行排序的一些建议。我试图将新变量中的值编码为0/1,具体取决于bigTable中的值是高于还是低于'thresholds'中的值

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}
  }
}

同样,非常感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:2)

以下是“如何使用数据框中的变量向数据框添加多列”这一问题的答案,这似乎是原始问题的一部分(在我们看到{ {1}}看起来像):

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))