我认为这可能是一个非常简单的问题,但我不能在网上或在我用来学习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}
}
}
同样,非常感谢您提供的任何帮助!
答案 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))