1

我认为这可能是一个非常简单的问题,但我一生都无法在网上或我用来学习 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 中的值是高于还是低于“阈值”中的值

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

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

4

1 回答 1

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 
于 2012-12-20T22:51:43.357 回答