R “融合”两个数据帧的最佳方式是什么?
我有两个数据帧df_a和df_b,它们都包含许多列和患者ID。这些列包含有关特定诊断正确或错误的信息。我的任务是组合这两个数据帧,以便在任何一个数据帧中该值为真时该值为真 实际上,df_a和df_b中的行数不同。应使用id进行匹配。两个数据帧具有相同的列集R “融合”两个数据帧的最佳方式是什么?,r,R,我有两个数据帧df_a和df_b,它们都包含许多列和患者ID。这些列包含有关特定诊断正确或错误的信息。我的任务是组合这两个数据帧,以便在任何一个数据帧中该值为真时该值为真 实际上,df_a和df_b中的行数不同。应使用id进行匹配。两个数据帧具有相同的列集 df_a <- data.frame(id = 1:10, dg_a = c(T, T, T, F, F, F, T, T, F, T), dg_b = c(F, F
df_a <- data.frame(id = 1:10,
dg_a = c(T, T, T, F, F, F, T, T, F, T),
dg_b = c(F, F, F, F, T, T, F, T, T, F))
df_b <- data.frame(id = 1:10,
dg_a = c(F, F, F, T, F, F, F, T, T, T),
dg_b = c(F, T, T, F, F, T, F, T, F, F))
在R中这样做的最佳方式是什么?我尝试过不同类型的联接,但我不能完全理解。您可以简单地使用|操作:
df_c <- data.frame(id = 1:10,
dg_a = df_a$dg_a | df_b$dg_a,
dg_b = df_a$dg_b | df_b$dg_b)
您只需使用|操作即可:
df_c <- data.frame(id = 1:10,
dg_a = df_a$dg_a | df_b$dg_a,
dg_b = df_a$dg_b | df_b$dg_b)
以下是一个dplyr解决方案,它考虑到两个data.frames中的行数可能不同:
library(dplyr)
full_join(df_a, df_b, by = "id") %>%
transmute(id,
dg_a = dg_a.x | dg_a.y,
dg_b = dg_b.x | dg_b.y)
这将包括两个data.frames中的行,即使没有匹配;有关其他行为,请参阅其他dplyr连接函数。这里是一个dplyr解决方案,它考虑到两个数据帧中的行数可能不同。帧:
library(dplyr)
full_join(df_a, df_b, by = "id") %>%
transmute(id,
dg_a = dg_a.x | dg_a.y,
dg_b = dg_b.x | dg_b.y)
这将包括两个data.frames中的行,即使没有匹配;有关其他行为,请参阅其他dplyr连接函数。使用dplyr和tidyr包可以实现非常通用的解决方案 方法:由于列的数量可能很多,因此我认为最好先使用gather以id、key和val的形式创建数据帧,然后使用bind_行合并数据帧并应用逻辑派生值,即。即使一个值为真,那么组合值也将为真。最后,使用SpreadfromTidyr包返回原始格式的数据帧
df_a <- data.frame(id = 1:10,
dg_a = c(T, T, T, F, F, F, T, T, F, T),
dg_b = c(F, F, F, F, T, T, F, T, T, F))
df_b <- data.frame(id = 1:10,
dg_a = c(F, F, F, T, F, F, F, T, T, T),
dg_b = c(F, T, T, F, F, T, F, T, F, F))
library(dplyr)
library(tidyr)
df_a %>% gather(key = "key", value = "val", -id) %>%
bind_rows(gather(df_b, key = "key", value = "val", -id )) %>%
group_by(id, key) %>%
summarise(val = ifelse(sum(val == TRUE) > 0, TRUE, FALSE)) %>%
spread(key, val) %>% as.data.frame()
# Result
# id dg_a dg_b
# 1 1 TRUE FALSE
# 2 2 TRUE TRUE
# 3 3 TRUE TRUE
# 4 4 TRUE FALSE
# 5 5 FALSE TRUE
# 6 6 FALSE TRUE
# 7 7 TRUE FALSE
# 8 8 TRUE TRUE
# 9 9 TRUE TRUE
# 10 10 TRUE FALSE
使用dplyr和tidyr包可以实现非常通用的解决方案 方法:由于列的数量可能很多,因此我认为最好先使用gather以id、key和val的形式创建数据帧,然后使用bind_行合并数据帧并应用逻辑派生值,即。即使一个值为真,那么组合值也将为真。最后,使用SpreadfromTidyr包返回原始格式的数据帧
df_a <- data.frame(id = 1:10,
dg_a = c(T, T, T, F, F, F, T, T, F, T),
dg_b = c(F, F, F, F, T, T, F, T, T, F))
df_b <- data.frame(id = 1:10,
dg_a = c(F, F, F, T, F, F, F, T, T, T),
dg_b = c(F, T, T, F, F, T, F, T, F, F))
library(dplyr)
library(tidyr)
df_a %>% gather(key = "key", value = "val", -id) %>%
bind_rows(gather(df_b, key = "key", value = "val", -id )) %>%
group_by(id, key) %>%
summarise(val = ifelse(sum(val == TRUE) > 0, TRUE, FALSE)) %>%
spread(key, val) %>% as.data.frame()
# Result
# id dg_a dg_b
# 1 1 TRUE FALSE
# 2 2 TRUE TRUE
# 3 3 TRUE TRUE
# 4 4 TRUE FALSE
# 5 5 FALSE TRUE
# 6 6 FALSE TRUE
# 7 7 TRUE FALSE
# 8 8 TRUE TRUE
# 9 9 TRUE TRUE
# 10 10 TRUE FALSE
如果数据帧中的行数不同,且并非所有ID都相同,该怎么办?@JuusoT您可以尝试我的解决方案,作为您问题的答案。该解决方案应该能够处理两个数据帧中的行数不同、ID不同甚至列数不同的情况。如果数据帧中的行数不同,而不是所有ID都相同,该怎么办?@JuusoT您可以尝试我的解决方案,作为您问题的答案。该解决方案应该能够处理两个数据帧中的行数不同、ID不同甚至列数不同的情况。@Mauritservers我同意该解决方案是该解决方案的一个变体,可以将其视为您提供的链接的副本。谢谢你的回答。我想这是个好问题。我在问题中添加了一个通用/灵活的答案。你可以看看。如果你有很多专栏,它可能会对你有所帮助。我必须为链接问题添加答案,因为这个问题被标记为重复问题。我认为这是完全不同的,可能需要对更基本/一般的问题进行注释@MKR,我建议将您的答案移到这个问题上,因为它并没有真正回答您在服务器上发布的问题。我同意这个解决方案是这个问题的一个变体,可以认为是您提供的链接的副本。谢谢你的回答。我想这是个好问题。我在问题中添加了一个通用/灵活的答案。你可以看看。如果你有很多专栏,它可能会对你有所帮助。我必须为链接问题添加答案,因为这个问题被标记为重复问题。我认为这是完全不同的,可能需要对更基本/一般的问题进行注释@MKR,我建议把你的答案移到这个问题上,因为它并没有真正回答你贴在上面的问题。