库(tidyverse)
reprex供您复制:
library(tidyverse)
tibble(
x1 = c(1, 2, NA, NA, 5),
y1 = c(4, 3, NA, NA, 7),
x2 = c(NA, NA, 6, 7, NA),
y2 = c(NA, NA, 2, 4, NA),
replace1 = c("A", "B", "C", "D", "E"),
replace2 = c("F", "G", "H", "I", "J")
)
我有这个数据帧:
# A tibble: 5 x 6
x1 y1 x2 y2 replace1 replace2
<dbl> <dbl> <dbl> <dbl> <chr> <chr>
1 1 4 NA NA A F
2 2 3 NA NA B G
3 NA NA 6 2 C H
4 NA NA 7 4 D I
5 5 7 NA NA E J
我需要数据帧是这样的,哪一个不同的管道会给我这个?。
# A tibble: 5 x 6
x1 y1 x2 y2 replace1 replace2
<chr> <chr> <chr> <chr> <chr> <chr>
1 1 4 A F A F
2 2 3 B G B G
3 C H 6 2 C H
4 D I 7 4 D I
5 5 7 E J E J
我们可以使用
library(dplyr)
library(stringr)
df1 %>%
mutate(across(1:4, ~ coalesce(as.character(.),
get(str_replace(cur_column(), "\D+", "replace")))))
-输出
# A tibble: 5 x 6
# x1 y1 x2 y2 replace1 replace2
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 1 4 F F A F
#2 2 3 G G B G
#3 C C 6 2 C H
#4 D D 7 4 D I
#5 5 7 J J E J
或者如果它是基于'x','y'
df1 %>%
mutate(replace_x = replace1, replace_y = replace2) %>%
mutate(across(1:4, ~ coalesce(as.character(.),
get(str_replace(cur_column(), "(\D+)\d+", "replace_\1"))))) %>%
select(-matches('replace_[xy]'))
# A tibble: 5 x 6
# x1 y1 x2 y2 replace1 replace2
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 1 4 A F A F
#2 2 3 B G B G
#3 C H 6 2 C H
#4 D I 7 4 D I
#5 5 7 E J E J
不是整齐的,而是带有apply
的基本R选项。
cols <- grep('replace', names(df))
df[] <- trimws(t(apply(df, 1, function(x) {x[is.na(x)] <- x[cols];x})))
# x1 y1 x2 y2 replace1 replace2
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 1 4 A F A F
#2 2 3 B G B G
#3 C H 6 2 C H
#4 D I 7 4 D I
#5 5 7 E J E J