我正在尝试顺序加入数据帧:
library(dplyr)
set.seed(1)
a <- 1:6
b <- rnorm(length(a))
df <- data.frame(a = a)
我的预期结果是
df_target <- data.frame(a = a, b = b)
df_target
a b
1 1 -0.6264538
2 2 0.1836433
3 3 -0.8356286
4 4 1.5952808
5 5 0.3295078
6 6 -0.8204684
首先,我要“添加”以下数据帧的b列(向量的前3个条目,b
它们属于的前3个条目a
:
df_to_add1 <- data.frame(a = a[1:3], b = b[1:3])
这可以通过以下方式实现left_join
从dplyr
包。
df1 <- left_join(df, df_to_add1)
df1
a b
1 1 -0.6264538
2 2 0.1836433
3 3 -0.8356286
4 4 NA
5 5 NA
6 6 NA
接下来,我要附加其余部分,即该对象的最后3个条目b
属于:的最后3个条目a
:
df_to_add2 <- data.frame(a = a[4:6], b = b[4:6])
如果我left_join
再次使用,则不会添加任何内容
left_join(df1, df_to_add2)
Joining, by = c("a", "b")
a b
1 1 -0.6264538
2 2 0.1836433
3 3 -0.8356286
4 4 NA
5 5 NA
6 6 NA
如果我使用full_join
,那么这就是我想要的,但是有重复的行:
full_join(df1, df_to_add2)
Joining, by = c("a", "b")
a b
1 1 -0.6264538
2 2 0.1836433
3 3 -0.8356286
4 4 NA
5 5 NA
6 6 NA
7 4 1.5952808
8 5 0.3295078
9 6 -0.8204684
我可以通过删除重复的行来获得目标:
df_tmp <- full_join(df1, df_to_add2)
df_tmp <- df_tmp[complete.cases(df_tmp),]
df_tmp
a b
1 1 -0.6264538
2 2 0.1836433
3 3 -0.8356286
7 4 1.5952808
8 5 0.3295078
9 6 -0.8204684
这似乎不是正确的解决方案,是否有更好的方法顺序连接数据帧?
首先加入_add *表。
library(dplyr)
result1 <- full_join(df_to_add1, df_to_add2) %>% full_join(df)
identical(result1, df_target)
## [1] TRUE
要不就:
result2 <- full_join(df_to_add1, df_to_add2)
identical(result2, df_target)
## [1] TRUE
要么
result3 <- df %>% right_join(df_to_add1) %>% full_join(df_to_add2)
identical(result3, df_target)
## [1] TRUE
问题的输入没有中间文本,因此更容易复制和粘贴:
# inputs
set.seed(1)
a <- 1:6
b <- rnorm(length(a))
df <- data.frame(a = a)
df_to_add1 <- data.frame(a = a[1:3], b = b[1:3])
df_to_add2 <- data.frame(a = a[4:6], b = b[4:6])
# desired
df_target <- data.frame(a = a, b = b)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句