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

时间:2017-04-03 17:55:47

标签: 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)
}

当我在某些数据上单独运行时,这是有效的:

myfun("Larry", "R2", foo)
myfun("Larry", "R2", foo)
myfun("Bob", "R1", foo)
myfun("Larry", "R1", foo)

foo
$Larry
[1] "R2" "R2" "R1"

$Bob
[1] "R1"

但是我无法让这个函数在数据框上工作:

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)

这会在控制台中产生以下内容(我不知道为什么?):

[1] 1 1 2 3

以及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

任何见解都将不胜感激!

1 个答案:

答案 0 :(得分:0)

您尝试运行的功能的一个更好的示例,结果将有所帮助。我会考虑使用dplyr :: mutate函数。或者,如果您尝试做一些简单的事情,我认为您可以在数据框datf$new <- myfun(inputs)

中创建一个新列