替换R中数据框中的特定值

问题描述 投票:0回答:2

下面你可以看到我的数据。

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 dplyr stringr
2个回答
0
投票

使用基础 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)

0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.