避免 FOR 循环,我如何从列表中增量索引?

Avoiding FOR LOOPs, how can I incrementally-index from a list?

我有一个类似于“mydf”的数据集,并选择通过以下过程来实现预期的结果data.frame“desired_outcome”。这是一个包含大约 30 个变量“字母”的真实数据集的简单示例,因此我有兴趣简化下面的代码示例。

library(dplyr)
mydf <- data.frame("Location" = factor(c("A10", "A10", "A11", "A11a", "A12", "B10", "B11", "B12")))
A_locs <- factor(c("A10", "A11", "A11a", "A12"))
B_locs <- factor(c("B10", "B11", "B12"))
mylst <- list("A's" = A_locs, "B's" = B_locs)

mydf$Letter <- NA #initialize new field within my data.frame
mydf$Letter[mydf$Location %in% mylst[[1]]] <- names(mylst)[1]
mydf$Letter[mydf$Location %in% mylst[[2]]] <- names(mylst)[2]

mydf
desired_outcome <- data.frame("Location" = factor(c("A10", "A10", "A11", "A11a", "A12", "B10", "B11", "B12")), 
                              "Letter" = factor(c("A's", "A's", "A's", "A's", "A's", "B's", "B's", "B's")))

我已经有了使用 FOR 循环的想法,尽管我强烈希望找到一种更聪明的方法来执行此操作。下面的循环不会产生预期的结果,但通常是我设想的循环本身的样子:

for (i in 1:length(names(mylst))){
  if(mydf$Location[i] %in% mylst[[i]]) {
    mydf$Letter <- names(mylst)[i]}
  return(mydf)
}

我研究过使用 lapply 或 sapply 等函数,但我不熟悉这些函数。我可以在这里使用任何巧妙的方法来:

1.) 清理我编写的代码并

2.) 避免没有 FOR 循环的长块手动迭代?

如果您愿意接受 tidyverse 方法,您可以尝试

library(tidyverse)

mydf %>% 
  mutate(Letter = deframe(map_dfr(mylst, tibble, .id = "name")[2:1])[Location])

这个returns

  Location Letter
1      A10    A's
2      A10    A's
3      A11    A's
4     A11a    A's
5      A12    A's
6      B10    B's
7      B11    B's
8      B12    B's