提问人:silent_hunter 提问时间:10/10/2023 更新时间:10/10/2023 访问量:48
在 R 中替换数据框中的特定值
Replace specific values in data frame in R
问:
您可以在下面看到我的数据。
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”。我期望的最终输出如下表所示。
那么,请有人可以帮助我解决这个问题吗?
答:
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))
通过使用 将这些值转换为 ,我们可以在 中有一个值时用来替换值。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
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
评论