我正在学习 R,并且尝试了 for 循环,但我找不到简化版本。我有一个包含 82 个唯一 ID 的数据集。我有一个包含 82 个函数的列表,对于每个 ID,我想将其应用于 2000 多个数字列,但我只想将这些函数应用于也共享相同 ID 的值。
我有一个与此类似的数据框,我想在其中使用函数进行预测:
身份证 | 数字 | 预测 |
---|---|---|
ID1 | 0.1 | - |
ID1 | 0.2 | - |
ID2 | 0.2 | - |
ID2 | 0.3 | - |
ID3 | 0.5 | - |
ID3 | 0.7 | - |
ID3 | 0.7 | - |
funclist[["ID1"]](df$num[df$ID == "ID1"])
我知道这行代码会给我该特定 ID 的预测值,但我不确定如何创建 for 循环,这样我就不必暴力破解 82 次。
pred <- numeric()
for (i in 1:length(funclist)) {
pred <- funclist[[i]](df$num[NatEmb$ID == i])
}
这没有任何结果
pred <- numeric()
for (i in 1:length(funclist)) {
pred <- funclist[[i]](df$num)
}
给出了结果,但在仔细检查第一行代码后,发现函数 ID 与数字列的 ID 不匹配。
如果有人可以提供一些关于如何成功做到这一点的建议,或者我缺乏的一些基本的 for 循环知识,那就太棒了。
你走在正确的轨道上,你的循环只需要一些调整。首先,我们可以制作数据:
tib <- tibble::tribble(
~ID, ~num, ~pred,
"ID1", 0.1, NA,
"ID1", 0.2, NA,
"ID2", 0.2, NA,
"ID2", 0.3, NA,
"ID3", 0.5, NA,
"ID3", 0.7, NA,
"ID3", 0.7, NA)
我刚刚定义了一个简单的函数列表,以便您可以看到它是如何工作的,想必您的函数列表比这更复杂。
funclist <- list(ID1 = function(x){x*2},
ID2 = function(x){x*3},
ID3 = function(x){x*4})
由于您希望通过循环传播的值是 ID(例如“ID1”、“ID2”),因此您需要将它们作为循环的内容。因此,您可以循环
1:length(funclist)
,而不是循环 names(funclist)
,那么索引将是每次函数的名称之一。在循环内,您想要更改 pred
的值,但仅限于具有适当 ID 的情况,您只需使用适当的 funclist
值和列 num
将这些观察结果替换为预测,但同样仅适用于有问题的 ID。
for (i in names(funclist)) {
tib$pred[tib$ID == i] <- funclist[[i]](tib$num[tib$ID == i])
}
tib
#> # A tibble: 7 × 3
#> ID num pred
#> <chr> <dbl> <dbl>
#> 1 ID1 0.1 0.2
#> 2 ID1 0.2 0.4
#> 3 ID2 0.2 0.6
#> 4 ID2 0.3 0.9
#> 5 ID3 0.5 2
#> 6 ID3 0.7 2.8
#> 7 ID3 0.7 2.8
创建于 2023-08-09,使用 reprex v2.0.2