R for 循环,用于根据另一列的 ID 将函数应用于数据帧向量

问题描述 投票:0回答:1

我正在学习 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 循环知识,那就太棒了。

r list for-loop character
1个回答
0
投票

你走在正确的轨道上,你的循环只需要一些调整。首先,我们可以制作数据:

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

© www.soinside.com 2019 - 2024. All rights reserved.