我有一个如下的df:
NEW_df <- data.frame(CAR = c("YES","NO","NO","YES","NO"),
BIKE = c(2,0,4,NA,9),
PLANE = c(8,0,6,7,9),
BOAT = c(NA,NA,NA,4,3),
SCOOTER = c(2,3,6,9,0))
如果CAR列为"否",我想将BOAT列中的NA替换为"0",这样我就可以有这样的东西:
NEW_df <- data.frame(CAR = c("YES","NO","NO","YES","NO"),
BIKE = c(2,0,4,NA,9),
PLANE = c(8,0,6,7,9),
BOAT = c(NA,0,0,4,3),
SCOOTER = c(2,3,6,9,0))
我想了这样的想法,但没有奏效:
NEW_df %>%
mutate(across(BOAT, ~ if_else(CAR == NO & is.na(.), 0, .)))
是否也可以将替换后的值放在一个新列中。
我们可以在base R
中轻松做到这一点
NEW_df$BOAT[is.na(NEW_df$BOAT) & NEW_df$CAR == "NO"] <- 0
%>%
不进行就地更换。我们必须用NEW_df <-
重新分配。此外,如果是单列,则不需要across
和语法错误(未引用NO
(
library(dplyr)
NEW_df <- NEW_df %>%
mutate(BOAT = replace(BOAT, CAR == "NO" & is.na(BOAT), 0))
使用dplyr的替代方案。。。
library(dplyr)
NEW_df <-
NEW_df %>%
mutate(BOAT = if_else(CAR=='NO' & is.na(BOAT), 0, BOAT))
您也可以使用data.table
library(data.table)
NEW_df <- as.data.table(NEW_df)
NEW_df[is.na(BOAT) & CAR == "NO", BOAT := 0]