我有两个整洁的小标题,其中一个匹配的键列(ID),而几个列的名称相同,但行值不同。 我想按ID将两个小标题合并,并将其他测量,时间戳和df2的值添加到df1的相应列中。
到目前为止,我已经尝试过full_join,merge,left_join等:
joined_df <- full_join(df1, df2, by="ID")
但是这将返回带有附加时间,值和度量值列(time.x,value.x等)的小标题。
但是,I希望通过ID将那些额外的df2值添加到df1的现有列中,以使生成的df添加了行,但没有添加列。
这是一个例子:
df1 <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3, 4),
time = c(1,2,3,4,5,6,7,8),
value = c(1, 2, 3, 4, 5, 6, 7, 8)
measurement = c(x,s,d,g,u,b,z,e)
xy = c(g,h,j,k,t,d,g,t)
df2 <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3, 4),
time = c(11,12,13,14,15,16,17,18),
value = c(8, 7, 6, 5, 4, 3, 2, 1),
measurement = c(r,t,z,u,i,o,k,f)
ab = c(j,k,o,l,p,f,b,c)
我需要一个联接函数,该函数将df2中添加的行数扩展到ID列,并包括从df2到df1的现有列的其他度量,值和时间戳。 预期的输出将是:
df3 <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4),
time = c(1,2,3,4,5,6,7,8,11,12,13,14,15,16,17,18),
value = c(1, 2, 3, 4, 5, 6, 7, 8, 8, 7, 6, 5, 4, 3, 2, 1)
measurement = c(x,s,d,g,u,b,z,e,r,t,z,u,i,o,k,f)
xy = c(g,h,j,k,t,d,g,t,g,h,j,k,t,d,g,t)
ab = c(j,k,o,l,p,f,b,c,j,k,o,l,p,f,b,c))
我无法找到某物。像那样提前非常感谢您!
答案 0 :(得分:0)
add_missing_columns <- function(from, to) {
to[setdiff(names(from), names(to))] <- from[setdiff(names(from), names(to))]
to
}
df2 <- add_missing_columns(from = df1, to = df2)
df1 <- add_missing_columns(from = df2, to = df1)
res <- rbind(df1, df2)
all.equal(df3, res)
# TRUE
有数据:
df1 <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3, 4),
time = c(1,2,3,4,5,6,7,8),
value = c(1, 2, 3, 4, 5, 6, 7, 8),
measurement = c(
"x", "s", "d", "g", "u", "b", "z", "e"),
xy = c(
"g", "h", "j", "k", "t", "d", "g", "t"),
stringsAsFactors = FALSE)
df2 <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3, 4),
time = c(11,12,13,14,15,16,17,18),
value = c(8, 7, 6, 5, 4, 3, 2, 1),
measurement = c(
"r", "t", "z", "u", "i", "o", "k", "f"),
ab = c(
"j", "k", "o", "l", "p", "f", "b", "c"),
stringsAsFactors = FALSE)
df3 <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4),
time = c(1,2,3,4,5,6,7,8,11,12,13,14,15,16,17,18),
value = c(1, 2, 3, 4, 5, 6, 7, 8, 8, 7, 6, 5, 4, 3, 2, 1),
measurement = c(
"x", "s", "d", "g", "u", "b", "z", "e", "r", "t", "z", "u", "i", "o", "k", "f"),
xy = c(
"g", "h", "j", "k", "t", "d", "g", "t", "g", "h", "j", "k", "t", "d", "g", "t"),
ab = c(
"j", "k", "o", "l", "p", "f", "b", "c", "j", "k", "o", "l", "p", "f", "b", "c"),
stringsAsFactors = FALSE)
答案 1 :(得分:0)
我现在设法通过结合使用bind_rows和left_join来解决它:
df3 <- bind_rows(df1[,c(2,3,5,6)], df2[,c(1,3,4,5)])
df1_lookup <-
df1 %>% select(ID,xy,cv) %>% distinct()
df2_lookup <-
df2 %>% select(ID,ab) %>% distinct()
df3 %>% left_join(df1_lookup, by="ID") %>% left_join(df2_lookup, by="ID")
谢谢!