首页 文章

使用purrr :: map进行递归函数调用

提问于
浏览
3

我有一个数据框中的列表,我想使用 purrr::map() 测试是否有任何 NULL 元素,然后摆脱它们 .

虽然我能够使用sapply来做到这一点,但是 Map 不起作用 . 我读了https://cran.r-project.org/web/packages/purrr/purrr.pdf,但我可以't figure out what'我错过了 .

这是我的sapply代码 - 这很好用:

P_Trans<- P_Trans[!sapply(P_Trans$Group,is.null),]

这是我为 purrr::map 尝试的一些事情,但它们不起作用 .

以下是我尝试过的四件事:

一个)

P_Trans %>% purrr::map(.,~is.null(Group))

b)

P_Trans %>% purrr::map(.,~is.null(.$Group))

C)

P_Trans %>% purrr::map(~is.null(.$Group))

d)

P_Trans %>% purrr::map(~is.null(Group))

有人可以纠正我的错误,让我知道我在做什么,我做错了以上四个选项?


数据:

dput(P_Trans)

structure(list(TransactionID = c("a1", "a1", "a1", "a2", "a2", 
"a2", "a3", "a3", "a3", "a3", "a4", "a5", "a5", "a5", "a5", "a5", 
"a6", "a6", "a7"), ProductID = c("A", "B", "1", "C", "4", "5", 
"D", "C", "7", "8", "H", "1", "2", "3", "3", "1", "H", "15", 
"22"), ProductType = c(1, 1, 2, 1, 2, 2, 1, 1, 2, 2, 1, 2, 2, 
2, 2, 2, 1, 2, 3), Group = list(structure(list(Group = "Group1"), .Names = "Group", row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = c("Group2", "Group3")), .Names = "Group", row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group2"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group2"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group3"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = c("Group2", "Group3")), .Names = "Group", row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group3"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group3"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group5"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group5"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group5"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), NULL)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -19L), .Names = c("TransactionID", 
"ProductID", "ProductType", "Group"))

1 回答

  • 0

    有了所有解决方案:

    • 你循环遍历 P_Trans 的每一列(不是通过项目/行)

    • 这些列是原子向量,列表(或data.frame)有名称,原子向量没有名称 . names(P_Trans[[1]]) # NULL

    • 你打算返回一个列表,而不是data.frame,虽然它之前崩溃了

    • a与c相同

    • b与d相同

    a) P_Trans %>% purrr::map(.,~is.null(Group))

    • Group 不存在,这里没有任何内容告诉我们我们应该在当前项目中查找它,甚至更少在表中

    b) P_Trans %>% purrr::map(.,~is.null(.$Group))

    • 你循环通过4个原子向量,每次寻找一个名为 Group 的元素,没有任何元素(即使是第4个),所以 $ operator is invalid for atomic vectors

    lmap 会帮助你循环遍历列作为 P_Trans 的长度一个子列表但是方法也会崩溃,只有最后一个项目会有一个名为 Groupnames(P_Trans[4]) # "Group" )的项目 .

    由于 map_lgl 被设计为像 sapply 那样返回 logical 的向量,因此 map 等同于你的解决方案 P_Trans[!map_lgl(P_Trans$Group,is.null),]

    获得你想要的其他方法:

    P_Trans %>% rowwise %>% filter(!is.null(Group))
    P_Trans %>% filter(lengths(Group)!=0)
    P_Trans[lengths(P_Trans$Group)!=0,]
    

相关问题