提高特定代码效率 - *base R* 替代 for() 循环解决方案

improving specific code efficiency - *base R* alternative to for() loop solution

寻找矢量化 base R 解决方案以供我自己借鉴。我正在根据数据框中另一列中的值将值分配给数据框中的列。

我的解决方案创建了一个可能代码的命名向量,在原始列中查找代码,根据找到的值对命名列表进行子集化,并将结果名称分配给新列。我确信有一种方法可以使用我创建的不需要 for 循环的命名向量来做到这一点;是应用程序的某个版本吗?

dplyr 很棒而且很有用,我不是在寻找使用它的解决方案。

# reference vector for assigning more readable text to this table
tempAssessmentCodes <- setNames(c(600,301,302,601,303,304,602,305,306,603,307,308,604,309,310,605,311,312,606,699),
                                c("base","3m","6m","6m","9m","12m","12m","15m","18m","18m","21m","24m","24m","27m","30m","30m",
                                  "33m","36m","36m","disch"))
                                    
for(i in 1:nrow(rawDisp)){
  rawDisp$assessText[i] <- names(tempAssessmentCodes)[tempAssessmentCodes==rawDisp$assessment[i]]
}

标准方法是使用 match():

rawDisp$assessText <- names(tempAssessmentCodes)[match(rawDisp$assessment, tempAssessmentCodes)]

对于每个 y 元素 match(x, y) 将在 x 中找到对应的元素索引。然后我们使用 y 的名称来用名称替换值。

就我个人而言,我采用相反的方式 - 让 tempAssesmentCodes 的名称与旧代码对应,值与新代码对应:

codes <- setNames(names(tempAssessmentCodes), tempAssessmentCodes)

然后简单地 select 使用名称(旧代码)的新代码中的元素:

rawDisp$assessText <- codes[as.character(rawDisp$assessment)]