R 使用迭代数据帧中的行的函数将元素追加到列表中

R 使用迭代数据帧中的行的函数将元素追加到列表中,r,list,append,scoping,mapply,R,List,Append,Scoping,Mapply,我试图使用一个类似python dict的列表,每次运行函数时都可以将其追加到列表中。最后,我希望将该函数应用于数据帧中的每一行。我正在一些玩具数据上进行试验: foo <- vector(mode="list", length=2) names(foo) <- c("Larry", "Bob") myfun <- function(name, round, foo){ foo[[name]] <<- c(foo[[name]], round) } 但我无法让

我试图使用一个类似python dict的列表,每次运行函数时都可以将其追加到列表中。最后,我希望将该函数应用于数据帧中的每一行。我正在一些玩具数据上进行试验:

foo <- vector(mode="list", length=2)
names(foo) <- c("Larry", "Bob")

myfun <- function(name, round, foo){
 foo[[name]] <<- c(foo[[name]], round)
}
但我无法让函数在数据帧上工作:

datf <- data.frame(name = c("Larry", "Larry", "Bob", "Larry"),
                   round = c("R2", "R2", "R2", "R1"))
mapply(myfun, name=datf$name, round=datf$round, foo=foo)
以及以下在富:

foo
$Larry
[1] 2

$Bob
[1] 3
我的另一个想法是尝试在for循环中应用myfun():

for(row in 1:nrow(datf)){
  myfun(datf$name, datf$round, foo)
}
但这会产生一个错误:

Error in foo[[name]] : no such index at level 2

任何见解将不胜感激

您尝试运行的函数的一个更好的示例,其结果将非常有用。我会考虑使用dplyr::mutate函数。或者,如果您想做一些简单的事情,我认为您可以在数据框
datf$new中创建一个新列。您可以使用一个简单的
split()
来实现这一点:
使用(datf,split(round,name))
。在语言之间转换时,学习不同的习惯用法比简单地翻译函数调用更有用。通常尽量避免

for(row in 1:nrow(datf)){
  myfun(datf$name, datf$round, foo)
}
Error in foo[[name]] : no such index at level 2