避免 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
我有一个类似于“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