给出一个df
,其中包含所有可能的行和列,每一行都是一个人,其中X1, X2, X3
是该人的ID,而所有Y columns
是该人的数据:
> df
X1 X2 X3 Y4 Y5 Y6 Y7 Y8 Y9 Y10
1 1 e 80 NA NA NA NA NA NA NA
2 4 w 47 NA NA NA NA NA NA NA
3 5 f 54 NA NA NA NA NA NA NA
4 6 c 94 NA NA NA NA NA NA NA
5 6 s 54 NA NA NA NA NA NA NA
6 7 r 22 NA NA NA NA NA NA NA
7 9 f 78 NA NA NA NA NA NA NA
8 9 p 26 NA NA NA NA NA NA NA
9 9 x 15 NA NA NA NA NA NA NA
10 9 y 16 NA NA NA NA NA NA NA
> a
X1 X2 X3 Y5 Y6
1 6 c 94 48 74
2 5 f 54 25 78
3 1 e 80 27 89
4 9 y 16 37 93
5 9 x 15 14 79
当我尝试合并df和a时,出现以下结果:
df2 <- merge(df,a, by.x = colnames(df[,1:3]), by.y=colnames(df[,1:3]), all=TRUE)
> df2
X1 X2 X3 Y4 Y5.x Y6.x Y7 Y8 Y9 Y10 Y5.y Y6.y
1 1 e 80 NA NA NA NA NA NA NA 27 89
2 4 w 47 NA NA NA NA NA NA NA NA NA
3 5 f 54 NA NA NA NA NA NA NA 25 78
4 6 c 94 NA NA NA NA NA NA NA 48 74
5 6 s 54 NA NA NA NA NA NA NA NA NA
6 7 r 22 NA NA NA NA NA NA NA NA NA
7 9 f 78 NA NA NA NA NA NA NA NA NA
8 9 p 26 NA NA NA NA NA NA NA NA NA
9 9 x 15 NA NA NA NA NA NA NA 14 79
10 9 y 16 NA NA NA NA NA NA NA 37 93
为什么不替换现有的NA,而是创建新的列?
可重复性代码:
df <- data.frame(matrix(ncol = 10, nrow=0))
substr(colnames(df)[4:10],start=1,stop=1) <- "Y"
xy <- data.frame(X1 = sample(1:9,10, replace = TRUE),
X2 = sample(letters[1:25],10, replace = TRUE),
X3 = sample(11:99,10,replace = TRUE),
Y4 = sample(1:9,10,replace=TRUE),
Y5 = sample(10:49,10,replace=TRUE),
Y6 = sample(50:99,10,replace=TRUE),
Y7 = sample(100:199,10,replace=TRUE),
Y8 = sample(200:299,10,replace=TRUE),
Y9 = sample(300:399,10,replace=TRUE),
Y10 =sample(400:499,10,replace=TRUE))
df <- merge(df,xy[,1:3], by.x = colnames(xy[,1:3]), by.y=colnames(xy[,1:3]), all.y = TRUE)
a <- xy[1:5,c(1:3,5:6)]
b <- xy[3:7,c(1:3,7:8)]
c <- xy[8:10,c(1:3,9:10)]
答案 0 :(得分:0)
运行代码以获得可重复性之后,您可以尝试下面的代码来将a,b,c设置为df。这能回答您的问题吗?
library(tidyverse)
transform_this <- function (data) {
data1 <- data %>%
mutate(x_all = paste(X1,X2,X3,sep = "|")) %>%
select(x_all,starts_with("Y"))
data1
}
transform_this(a) %>%
full_join(transform_this(b)) %>%
full_join(transform_this(c)) %>%
separate(col = x_all,into = c("X1","X2","X3"))