我在列表中有两个具有不同列的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
?提前致谢
答案 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)