如何用另一列中的值替换差异列中的数值?(R)



库(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     

最新更新