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

Replace specific values in data frame in R

提问人:silent_hunter 提问时间:10/10/2023 更新时间:10/10/2023 访问量:48

问:

您可以在下面看到我的数据。

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")
)

enter image description here

现在我想将 R1 列中的值替换为 R2 列,但前提是 R2 中的值为“-”或“NA”。我期望的最终输出如下表所示。

enter image description here

那么,请有人可以帮助我解决这个问题吗?

R dplyr 纵梁

评论


答:

3赞 MrFlick 10/10/2023 #1

使用基本 R 你可以做

within(df, {
          SWAP <- R2=="NA" | R2=="-"
          R2 <- ifelse(SWAP, R1, R2)
          R1 <- ifelse(SWAP, "", R1)
          SWAP <- NULL
})

只需创建一个变量,指示是否应该进行交换,然后用于交换列。请注意,交换的顺序很重要,因为变量会立即更改。最后一个 SWAP<-NULL 将其从输出中删除。ifelse

它与dplyr

dplyr::mutate(df, 
    SWAP = R2=="NA" | R2=="-",
    R2 = if_else(SWAP, R1, R2),
    R1 = if_else(SWAP, "", R1),
    SWAP = NULL)
3赞 LMc 10/10/2023 #2
library(dplyr)

df |>
  mutate(R2 = replace(R2, R2 %in% c("-", "NA"), NA),
         R2 = coalesce(R2, R1),
         R1 = ifelse(R1 == R2, "", R1))

通过使用 将这些值转换为 ,我们可以在 中有一个值时用来替换值。replaceNAcoalesceNAR1

输出

  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
2赞 margusl 10/10/2023 #3

为了匹配上一个问题使用的模式,找到行和交换列:

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")
)

to_swap <- df$R2 %in% c("-", "NA")
to_swap
#> [1]  TRUE FALSE  TRUE FALSE

df[to_swap, c("R1", "R2")] <- df[to_swap, c("R2", "R1")]
df
#>   R1                              R2
#> 1  - EFTA : 0 / BAA/GBR : 0 / ES : 2
#> 2 10 EFTA : 0 / BAA/GBR : 0 / ES : 2
#> 3 NA EFTA : 0 / BAA/GBR : 0 / ES : 2
#> 4 NA CEFTA : 0 / MSA/GB : 0 / TR : 0

创建于 2023-10-09 使用 reprex v2.0.2