在R中使用lmap将函数应用于列表时出错
我有一个基于运行以下命令的数据帧列表:在R中使用lmap将函数应用于列表时出错,r,purrr,R,Purrr,我有一个基于运行以下命令的数据帧列表: library(tidyverse) candidates <- c("A1", "A2", "A3", "B1", "B2") votes <- function(aa, ab, ba, bb, can) { aprob <- c(aa, aa, aa, ab, ab) bprob <- c(ba, ba, ba, bb
library(tidyverse)
candidates <- c("A1", "A2", "A3", "B1", "B2")
votes <- function(aa, ab, ba, bb, can) {
aprob <- c(aa, aa, aa, ab, ab)
bprob <- c(ba, ba, ba, bb, bb)
avotes <- t(replicate(25, (sample(can, replace = FALSE, prob = aprob))))
bvotes <- t(replicate(20, (sample(can, replace = FALSE, prob = bprob))))
avotes <- as_tibble(avotes)
bvotes <- as_tibble(bvotes)
all_votes <- bind_rows(avotes, bvotes)
}
z <- map(1:5, ~ votes(aa = .6, ab = .4, ba = .4, bb = .6, candidates))
如果我从列表中提取一个数据帧并运行count函数,它工作得很好,因此我知道我用lmap做了一些错误的事情。由于lmap的作用是将函数应用于列表并返回一个列表,所以我认为这就是我在这里想要使用的。我不知道是什么错误试图告诉我。我希望能得到一些关于我做错了什么以及如何修复它的帮助。完全有可能是一个愚蠢的错误盯着我看,我只是没有看到它
我知道我可以通过把第二个函数的代码放到第一个函数中来解决这个问题,但是我需要把它分开。我仍然想知道我做错了什么,这样以后就不会重复了。在代码中,OP使用了lambda表达式,而不是对list元素应用函数。基于创建的函数,它更适合
map
a1 <- map(z, count)
请注意,map
和lmap
的输出结构有所不同,因为lmap
返回list
作为输出,它是25个向量的list
,虽然map
是一个5位的列表,也就是说,如果我们检查'a1'的第一个列表元素和'a2'的前五个元素的输出,它是相同的,类似地,是'a1'的第二个元素和'a2'的下五个元素(6:10)
all.equal(unclass(a1[[1]]), a2[1:5], check.attributes = FALSE)
#[1] TRUE
map(z,count)
应该可以工作,如果您使用的是lambda表达式,那么您需要~count(.x))
感谢您花时间解释,尽管解决方案只是使用map。我将来会更容易理解事情。我发誓我以前试过常规地图,但现在它运行得很好。
a1 <- map(z, count)
a1 <- map(z, ~ count(.x))
a2 <- lmap(z, ~ count(.x[[1]]))
all.equal(unclass(a1[[1]]), a2[1:5], check.attributes = FALSE)
#[1] TRUE