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
我需要数据框是这样的,哪个 tidyverse 管道可以让我做到这一点?
# 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
推荐阅读
- pyaudio - Mac OS X M1 上的 Pyaudio 设置
- statsmodels - 需要安装 statsmodels 0.13 但不起作用
- xml - 使用基于其他段中的条件检查的值填充 XSLT 中的变量
- coordinates - IFC 中的反转坐标 (x, y)
- javascript - 具有不安全 URL 的锚点是否容易受到 XSS 攻击?
- gherkin - 场景捕捉条件
- go - 在供应商文件中修改结构类型
- c - 找到包含整数的第 k 个最短区间
- hadoop - 当 Amazon S3 强一致性时,hadoop-aws 的 S3Guard 是否仍然相关?
- r - 如何从列中提取和求和不同的值并使用总和创建列