【问题标题】:Recode a dataframe variable based on matches in a list根据列表中的匹配重新编码数据框变量
【发布时间】:2018-07-17 02:58:04
【问题描述】:

我正在尝试根据与单独列表中元素的匹配来重新编码数据框中的变量。例如:

df <- data.frame(stringsAsFactors = FALSE,
  var1 = c("116", "117", "118", "SL1", "SL2", "234"))

matchList <- list(c("116, 117, and 118", "116", "117", "118"), 
c("SL1/SL2", "SL1", "SL2"))

df
var1
1     116
2     117
3     118
4     SL1
5     SL2
6     234

matchList
[[1]]
[1] "116, 117, and 118" "116"               "117"               "118"              

[[2]]
[1] "SL1/SL2" "SL1"     "SL2"    

如果原始 var1 元素与 matchList 元素的第 2 - 4 项匹配,则应使用同一列表元素的第 1 项对其进行重新编码。我希望重新编码的 var1 如下所示:

var1
1     116, 117, and 118
2     116, 117, and 118
3     116, 117, and 118
4     SL1/SL2
5     SL1/SL2
6     234

以下代码行一次处理一个列表元素,但我不清楚如何自动执行此操作:

# get indices of matches for matchList element 1
r <- which(df$var1 %in% matchList[[1]]) 
# replace matches with first list item of list element 1 using indices of matches
df$var1[r] <- matchList[[1]][1] 

我尝试了以下 for 循环,但我不确定我缺少什么

for (i in length(matchList)){
  r <- which(df$var1 %in% matchList[[i]])
  df$var1[r] <- matchList[[i]][1]
}

【问题讨论】:

    标签: r list dataframe recode


    【解决方案1】:

    问题出在length(matchList) 中,它是单个值,即 2。相反,我们需要遍历序列

    for(i in seq_along(matchList)) {
         r <- which(df$var1 %in% matchList[[i]])
         df$var1[r] <- matchList[[i]][1]
      } 
    df
    #               var1
    #1 116, 117, and 118
    #2 116, 117, and 118
    #3 116, 117, and 118
    #4           SL1/SL2
    #5           SL1/SL2
    #6               234
    

    【讨论】:

      【解决方案2】:

      您的方法的替代方法是使用&lt;&lt;- 运算符对lapply 执行相同的操作。

      lapply(matchList, function(x) {
        df$var1[df$var1 %in% x] <<- x[[1]]
      })
      df
      
      #              var1
      #1 116, 117, and 118
      #2 116, 117, and 118
      #3 116, 117, and 118
      #4           SL1/SL2
      #5           SL1/SL2
      #6               234
      

      但是,在使用&lt;&lt;- 之前,您可能需要阅读How do you use scoping assigment.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 2022-01-09
        • 1970-01-01
        • 2011-06-20
        相关资源
        最近更新 更多