r - 在 R 中快速执行多次连接

标签 r dplyr

我有一个与此类似的数据框:

n = c(rep("x", 3), rep("y", 5), rep("z", 2)) 
s = c("aa", "bb", "cc", "dd", "ee", "aa", "bb", "cc", "dd", "ff") 
df = data.frame(n, s) 

如果我要在 df$s 上加入它们,我想找到每个唯一 df$n 与其他每个 df$n 的匹配数。以下方法有效,但速度非常慢,而且我有很大的数据集。有没有更快的方法来解决这个问题?

place <- unique(df$n)
df_answer <- data.frame(place1 ="test1", place2 = "test2", matches = 2)
for(i in place) { 
  for(k in place) { 
    m1 <- inner_join(filter(df, n == i), filter(df, n == k), by = "s")
    m2 <- data.frame(place1 = i, place2 = k, matches = length(m1$s))
    df_answer <- rbind(df_answer, m2)
  } 
} 
df_answer <- filter(df_answer, place1 != "test1")

最佳答案

您可能只需使用几个 merge 调用就可以绕过很多这种循环等:

ans <- expand.grid(place1=unique(df$n),place2=unique(df$n))
counts <- aggregate(s ~ ., data=
           setNames(merge(df, df, by="s",all=TRUE),c("s","place1","place2")), FUN=length)
merge(ans, counts, all=TRUE)

#  place1 place2  s
#1      x      x  3
#2      x      y  3
#3      x      z NA
#4      y      x  3
#5      y      y  5
#6      y      z  1
#7      z      x NA
#8      z      y  1
#9      z      z  2

我对 dplyr 没有希望,但也许类似这样的事情:

expand.grid(n.x=unique(df$n), n.y=unique(df$n)) %>%
left_join(
          inner_join(df,df,by="s") %>% 
          group_by(n.x,n.y) %>% 
          summarise(s=length(s))
         )

关于r - 在 R 中快速执行多次连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28799778/

相关文章:

r - 针织/Rmd : Adding title page and text when converting to MS Word

R 栅格从 XYZ : x cell sizes are not regular

r - 如何将一列(逗号拆分)转换为 R 中的多列?

r - 过滤 R 中以任何拉丁字母开头的所有行

r - 使用 embrace {{ arg }} 在 dplyr 中选择负值的问题

r - 在函数中使用 ggplot2 时出现 ArrangeGrob 错误

python - 如何将 "keras"从 1.2.0 升级到 2.0.0?

r - 创建一个 Y 变量,它是 X 变量的计数

r - 使用行中上一个日期的下一个日期填充日期列

r - 使用 group_by 时添加整体平均值