如何删除`bind_rows`引入的data.frame中的冗余列?

时间:2017-01-29 15:45:40

标签: r dataframe

我在列表中有两个具有不同列的data.frame,我打算将它们组合成一个data.frame列表,我使用SO中的现有解决方案。是的,dplyr函数运行良好,但bind_rows引入了拆分所需的额外列。但是,我希望在拆分单个data.frame后继续管道,同时删除每个data.frame中的冗余列。我尝试使用select取消列,但它不起作用。是否可以继续我的管道删除列而不是使用另一个lapply来执行此操作?我怎样才能做到这一点?有什么想法吗?

这是我需要合并的data.frame列表,然后拆分它:

DF <- list(
    hue = data.frame( begin=seq(1, by=6, len=10), end=seq(4, by=6, len=10), val=sample(30, 10)),
    ack = data.frame( begin=seq(3, by=9, len=8), end=seq(6, by=9, len=8), val=sample(45, 8)),
    ken = data.frame( begin=seq(6, by=8, len=6), end=seq(11, by=8, len=6), val=sample(52, 6))
)

MF <- list(
    hue = data.frame( begin=seq(11, by=6, len=7), end=seq(14, by=6, len=7), 
                      val=sample(30, 7), cmb.val=sample(24, 7)),
    ack = data.frame( begin=seq(13, by=9, len=5), end=seq(6, by=9, len=5), 
                      val=sample(45, 5), cmb.val=sample(18, 5)),
    ken = data.frame( begin=seq(16, by=8, len=6), end=seq(21, by=8, len=6), 
                      val=sample(52, 6), cmb.val=sample(20, 6))
)

这是我的合并和拆分操作的解决方案:

res <- bind_rows(DF, MF, .id = "GRP") %>% 
    mutate(cmb.val = ifelse(is.na(cmb.val),0,cmb.val)) %>%
    split(.$GRP)

我很想知道是否有可能继续上述管道并删除每个data.frame中的冗余列GRP。也许我的尝试不可行,但尝试使用此选项而不是在新行中使用lapply方法。

在我想要的输出中,GRP列不应包含在每个data.frame中。

任何人都可以给我一个可能的想法吗?是否可以继续使用管道来删除额外的列GRP?提前致谢

2 个答案:

答案 0 :(得分:3)

我们可以使用map

library(purrr)
bind_rows(DF, MF, .id = "GRP") %>% 
        mutate(cmb.val = ifelse(is.na(cmb.val),0,cmb.val)) %>%
        split(.$GRP) %>%
        map(~.[setdiff(names(.), "GRP")])
        #or with `select`
        #map(~select(., -one_of("GRP")))

答案 1 :(得分:2)

您可以将lapply()select()合并,如下所示:

bind_rows(DF, MF, .id = "GRP") %>% 
    mutate(cmb.val = ifelse(is.na(cmb.val), 0, cmb.val)) %>%
    split(.$GRP) %>%
    lapply(select, -GRP)