Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R";“合并”;到数据帧中的列_R_Dataframe - Fatal编程技术网

R";“合并”;到数据帧中的列

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中的值填

我需要你帮我写一个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
中的值填充
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