嵌套 full_join 后缀超过 2 data.frames
Nested full_join with suffixes for more than 2 data.frames
我想将几个 data.frames 与一些常用列合并,并在列名后附加一个后缀,以跟踪每列数据的来源。
我可以在第一个 full_join 中使用后缀项轻松完成,但是当我进行第二个连接时,没有添加任何后缀。我可以重命名第三个 data.frame 所以它有后缀,但我想知道是否有另一种使用后缀术语的方法。
这是一个示例代码:
x = data.frame(col1 = c("a","b","c"), col2 = 1:3, col3 = 1:3)
y = data.frame(col1 = c("b","c","d"), col2 = 4:6, col3 = 1:3)
z = data.frame(col1 = c("c","d","a"), col2 = 7:9, col3 = 1:3)
> df = full_join(x, y, by = "col1", suffix = c("_x","_y")) %>%
full_join(z, by = "col1", suffix = c("","_z"))
> df
col1 col2_x col3_x col2_y col3_y col2 col3
1 a 1 1 NA NA 9 3
2 b 2 2 4 1 NA NA
3 c 3 3 5 2 7 1
4 d NA NA 6 3 8 2
我原以为 data.frame z
中的 col2
和 col3
会有一个“_z”后缀。我尝试在合并两个 data.frames 时使用空后缀并且它有效。
我可以通过在执行第二个 full_join 之前重命名 z
中的列来解决问题,但在我的真实数据中,我有几个公共列,如果我想合并更多 data.frames 它会使代码复杂化。这是我的预期输出。
> colnames(z) = paste0(colnames(z),"_z")
> df = full_join(x, y, by = "col1", suffix = c("_x","_y")) %>%
full_join(z, by = c("col1"="col1_z"))
> df
col1 col2_x col3_x col2_y col3_y col2_z col3_z
1 a 1 1 NA NA 9 3
2 b 2 2 4 1 NA NA
3 c 3 3 5 2 7 1
4 d NA NA 6 3 8 2
我看过其他 ,其中添加了一个额外的列来跟踪源 data.frame,但我想知道为什么后缀术语不适用于多个连接。
PS:如果我将第一个后缀留空,我可以在第二个连接中添加后缀,但这将使 col2 和 col3 形式 x 没有后缀。
> df = full_join(x, y, by = "col1", suffix = c("","_y")) %>%
full_join(z, by = "col1", suffix = c("","_z"))
> df
col1 col2 col3 col2_y col3_y col2_z col3_z
1 a 1 1 NA NA 9 3
2 b 2 2 4 1 NA NA
3 c 3 3 5 2 7 1
4 d NA NA 6 3 8 2
你可以这样做:
full_join(x, y, by = "col1", suffix = c("","_y")) %>%
full_join(z, by = "col1", suffix = c("_x","_z"))
col1 col2_x col3_x col2_y col3_y col2_z col3_z
1 a 1 1 NA NA 9 3
2 b 2 2 4 1 NA NA
3 c 3 3 5 2 7 1
4 d NA NA 6 3 8 2
在最后一个连接处为 x
添加 suffix
应该可以解决问题。
我想将几个 data.frames 与一些常用列合并,并在列名后附加一个后缀,以跟踪每列数据的来源。
我可以在第一个 full_join 中使用后缀项轻松完成,但是当我进行第二个连接时,没有添加任何后缀。我可以重命名第三个 data.frame 所以它有后缀,但我想知道是否有另一种使用后缀术语的方法。
这是一个示例代码:
x = data.frame(col1 = c("a","b","c"), col2 = 1:3, col3 = 1:3)
y = data.frame(col1 = c("b","c","d"), col2 = 4:6, col3 = 1:3)
z = data.frame(col1 = c("c","d","a"), col2 = 7:9, col3 = 1:3)
> df = full_join(x, y, by = "col1", suffix = c("_x","_y")) %>%
full_join(z, by = "col1", suffix = c("","_z"))
> df
col1 col2_x col3_x col2_y col3_y col2 col3
1 a 1 1 NA NA 9 3
2 b 2 2 4 1 NA NA
3 c 3 3 5 2 7 1
4 d NA NA 6 3 8 2
我原以为 data.frame z
中的 col2
和 col3
会有一个“_z”后缀。我尝试在合并两个 data.frames 时使用空后缀并且它有效。
我可以通过在执行第二个 full_join 之前重命名 z
中的列来解决问题,但在我的真实数据中,我有几个公共列,如果我想合并更多 data.frames 它会使代码复杂化。这是我的预期输出。
> colnames(z) = paste0(colnames(z),"_z")
> df = full_join(x, y, by = "col1", suffix = c("_x","_y")) %>%
full_join(z, by = c("col1"="col1_z"))
> df
col1 col2_x col3_x col2_y col3_y col2_z col3_z
1 a 1 1 NA NA 9 3
2 b 2 2 4 1 NA NA
3 c 3 3 5 2 7 1
4 d NA NA 6 3 8 2
我看过其他
PS:如果我将第一个后缀留空,我可以在第二个连接中添加后缀,但这将使 col2 和 col3 形式 x 没有后缀。
> df = full_join(x, y, by = "col1", suffix = c("","_y")) %>%
full_join(z, by = "col1", suffix = c("","_z"))
> df
col1 col2 col3 col2_y col3_y col2_z col3_z
1 a 1 1 NA NA 9 3
2 b 2 2 4 1 NA NA
3 c 3 3 5 2 7 1
4 d NA NA 6 3 8 2
你可以这样做:
full_join(x, y, by = "col1", suffix = c("","_y")) %>%
full_join(z, by = "col1", suffix = c("_x","_z"))
col1 col2_x col3_x col2_y col3_y col2_z col3_z
1 a 1 1 NA NA 9 3
2 b 2 2 4 1 NA NA
3 c 3 3 5 2 7 1
4 d NA NA 6 3 8 2
在最后一个连接处为 x
添加 suffix
应该可以解决问题。