Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R “融合”两个数据帧的最佳方式是什么?_R - Fatal编程技术网

R “融合”两个数据帧的最佳方式是什么?

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和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, 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,我建议把你的答案移到这个问题上,因为它并没有真正回答你贴在上面的问题。