我有一个需要使用dplyr::coalesce()的数据集。但是我想多次这样做,并且不确定什么是更有效的方法(例如循环、应用等)。
要给您一个玩具示例,假设我的数据集是:
df = data.frame(
a = c(1, NA, NA),
a.1 = c(NA, 1, NA),
a.2 = c(NA, NA, 1),
b = c(2, NA, NA),
b.1 = c(NA, 2, NA),
b.2 = c(NA, NA, 2),
c = c(3, NA, NA),
c.1 = c(NA, 3, NA),
c.2 = c(NA, NA, 3)
)我可以这么做:
new_df = df |>
dplyr::mutate(
a = dplyr::coalesce(a, a.1, a.2),
b = dplyr::coalesce(b, b.1, b.2),
c = dplyr::coalesce(c, c.1, c.2)
) |>
dplyr::select(a, b, c)这会让我:
new_df
a b c
1 1 2 3
2 1 2 3
3 1 2 3首先,我怎样才能有效地做到这一点而不需要写很多次的合并呢?这里的例子只是一个例子,我真的需要在dataset上做40次。
还有,是否有一种方法,就像我在这里做的那样,基本上只保留a,b,c,而不是把它命名为a.1或其他什么?
发布于 2022-06-03 01:44:44
如果列类似于something和somthing.etc形状,
你可以试试
library(dplyr)
library(stringr)
df %>%
split.default(str_remove(names(.), "\\..*")) %>%
map_df(~ coalesce(!!! .x))
a b c
<dbl> <dbl> <dbl>
1 1 2 3
2 1 2 3
3 1 2 3发布于 2022-06-03 01:51:10
这里有另一种选择,即旋转:
library(dplyr)
library(tidyr)
df %>%
pivot_longer(everything()) %>%
mutate(name = sub("\\..*", "", name)) %>%
drop_na %>%
pivot_wider(names_from = name, values_from = value, values_fn = list) %>%
unnest(cols = c(a, b, c)) a b c
<dbl> <dbl> <dbl>
1 1 2 3
2 1 2 3
3 1 2 3https://stackoverflow.com/questions/72483852
复制相似问题