R";“合并”;到数据帧中的列
我需要你帮我写一个R脚本 我有一个df,看起来与此类似:R";“合并”;到数据帧中的列,r,dataframe,R,Dataframe,我需要你帮我写一个R脚本 我有一个df,看起来与此类似: X1 X2 X3 1 123 NA 2 125 125 3 210 NA 4 NA 212 5 214 213 6 NA 225 我需要以某种方式合并X2和X3,让X2中的每个“NA”都被X3的值子集化 df应如下所示: X1 X2 1 123 2 125 3 210 4 212 5 214 6 225 谢谢你的帮助 使用dplyr可以使用coalesce执行以下操作。这将用X3中的值填
X1 X2 X3
1 123 NA
2 125 125
3 210 NA
4 NA 212
5 214 213
6 NA 225
我需要以某种方式合并X2和X3,让X2中的每个“NA”都被X3的值子集化
df应如下所示:
X1 X2
1 123
2 125
3 210
4 212
5 214
6 225
谢谢你的帮助 使用
dplyr
可以使用coalesce
执行以下操作。这将用X3
中的值填充X2
列中缺少的NA
library(tidyverse)
df %>%
mutate(X2 = coalesce(X2, X3))
输出
X1 X2 X3
1 1 123 NA
2 2 125 125
3 3 210 NA
4 4 212 212
5 5 214 213
6 6 225 225
这将替换NA值
df$X2[is.na(df$X2)] <- df$X3[is.na(df$X2)]
df$X2[is.na(df$X2)]你可以使用[这能实现你想要的吗df$X2工作得很好!非常感谢
df <- df[,-3]
i <- is.na(x$X2)
#i <- which(is.na(x$X2)) #Alternative
x$X2 <- "[<-"(x$X2, i, x$X3[i])
#x$X2[i] <- x$X3[i] #Alternative
x$X3 <- NULL
x
# X1 X2
#1 1 123
#2 2 125
#3 3 210
#4 4 212
#5 5 214
#6 6 225
set.seed(42)
n <- 1e6
tt <- seq_len(n)
y <- data.frame(X1=tt, X2=tt, X3=tt)
y$X2[sample(tt, n %/% 5)] <- NA
y$X3[sample(tt, n %/% 5)] <- NA
library(tidyverse) #For Ben
library(microbenchmark)
microbenchmark(setup = {x <- y}
, GKi = {i <- is.na(x$X2)
x$X2 <- "[<-"(x$X2, i, x$X3[i])
x$X3 <- NULL}
, GKi2 = {i <- which(is.na(x$X2))
x$X2 <- "[<-"(x$X2, i, x$X3[i])
x$X3 <- NULL}
, GKi3 = {i <- which(is.na(x$X2))
x$X2[i] <- x$X3[i]
x$X3 <- NULL}
, OttoKaessi = {x$X2 <- ifelse(!is.na(x$X2), x$X2, x$X3)
x$X3 <- NULL} #Added
, DanielO = {x$X2[is.na(x$X2)] <- x$X3[is.na(x$X2)]
x <- x[,-3]}
, Ben = {x %>% mutate(X2 = coalesce(X2, X3))
x$X3 <- NULL} #Added
, control=list(order="block"))
#Unit: milliseconds
# expr min lq mean median uq max neval cld
# GKi 7.103401 7.201073 9.812947 8.329747 9.670540 135.0823 100 a
# GKi2 5.538879 5.592595 7.640384 5.661441 7.935306 132.6357 100 a
# GKi3 5.543583 5.614935 7.787013 5.709262 7.967789 133.1286 100 a
# OttoKaessi 20.123728 22.516887 29.823813 23.226925 24.818421 152.3072 100 b
# DanielO 8.109087 8.381130 12.448476 10.622454 11.025723 136.7104 100 a
# Ben 13.565411 13.736668 22.091870 16.371157 17.147923 148.0921 100 b