下面你可以看到我的数据。
df <- data.frame(
R1 = c("EFTA : 0 / BAA/GBR : 0 / ES : 2", "10","EFTA : 0 / BAA/GBR : 0 / ES : 2","NA"),
R2 = c("-", "EFTA : 0 / BAA/GBR : 0 / ES : 2","NA","CEFTA : 0 / MSA/GB : 0 / TR : 0")
)
现在我想将 R1 列中的值替换到 R2 列中,但前提是 R2 中的值为“-”或“NA”。我期望的最终输出如下表所示。
请问有人可以帮我解决这个问题吗?
使用基础 R 你可以做
within(df, {
SWAP <- R2=="NA" | R2=="-"
R2 <- ifelse(SWAP, R1, R2)
R1 <- ifelse(SWAP, "", R1)
SWAP <- NULL
})
只需创建一个变量来指示是否应该进行交换,然后使用
ifelse
来交换列。请注意交换的顺序很重要,因为变量会立即改变。最后一次交换<-NULL removes it from the output.
它会与
dplyr
类似
dplyr::mutate(df,
SWAP = R2=="NA" | R2=="-",
R2 = if_else(SWAP, R1, R2),
R1 = if_else(SWAP, "", R1),
SWAP = NULL)
library(dplyr)
df |>
mutate(R2 = replace(R2, R2 %in% c("-", "NA"), NA),
R2 = coalesce(R2, R1),
R1 = ifelse(R1 == R2, "", R1))
通过使用
replace
将这些值转换为 NA
,当 coalesce
中有值时,我们可以使用 NA
来替换 R1
值。
输出
R1 R2
1 EFTA : 0 / BAA/GBR : 0 / ES : 2
2 10 EFTA : 0 / BAA/GBR : 0 / ES : 2
3 EFTA : 0 / BAA/GBR : 0 / ES : 2
4 NA CEFTA : 0 / MSA/GB : 0 / TR : 0