【问题标题】:R foreach loop compare every row to every rowR foreach循环将每一行与每一行进行比较
【发布时间】:2017-07-31 15:09:25
【问题描述】:

我想将 df 中的每一行与同一 df 中的每一行进行比较(并计算一些函数)。我已经设法编写了一个 foreach 循环,但它只将每一行与最后一行进行比较。

这是我到目前为止所做的一个最小的我们:

# create toy df
ID <- c(345, 476, 234, 987, 123) # assign random id
Language <- c("aa", "bb", "cc", "dd", "ee") # names of languages
Latitude <- c(-17, -25, 44, -8, 29) 
Longitude <- c(130, 29, -122, 120, -110)
sample <- data.frame(ID, Language, Latitude, Longitude)


sample
   ID Language Latitude Longitude
1 345       aa      -17       130
2 476       bb      -25        29
3 234       cc       44      -122
4 987       dd       -8       120
5 123       ee       29      -110


# foreach loop that should pair every language with every other
sample.rows <- nrow(sample)

loop <- foreach(i=1:(sample.rows-1),.combine=rbind) %do% {
   empty.pairs <- c()
   for(j in (i+1):sample.rows){
     pairs <- rbind(empty.pairs, c(i, j)) 
   }
  data.frame(Lang1 = sample$Language[pairs[,1]],
              Lang2 = sample$Language[pairs[,2]],
              i= pairs[,1],
              j= pairs[,2])
   }

输出如下:

loop
 Lang1 Lang2 i j
1    aa    ee 1 5
2    bb    ee 2 5
3    cc    ee 3 5
4    dd    ee 4 5

即该循环仅将前四行与最后一行进行比较,但我希望它将所有行与所有其他行进行比较,例如语言“aa”不仅应与“ee”进行比较,还应与“bb”、“cc”和“dd”进行比较。 任何提示表示赞赏!

【问题讨论】:

  • 您在每个循环上重置 empty.pairs。
  • 如果您知道要创建的对象的大小,请预先分配并填充它,而不是增加空对象。
  • @Dave2e:好的,那我该如何避免这样做呢?
  • @F.Privé:真实数据有 2432 行,所以我认为这不是一个可行的解决方案……还是我误解了这个?
  • @Dave2e 感谢您的跟进!我得到了完全相同的输出,所以这似乎不是问题:-/

标签: r foreach


【解决方案1】:

我认为您想要的是所有语言组合的网格。你可以使用expand.grid:

grid <- cbind(
  expand.grid(sample$Language, sample$Language),
  expand.grid(seq_len(sample.rows), seq_len(sample.rows))
)
names(grid) <- c("Lang1", "Lang2", "i", "j")
grid <- grid[grid[["j"]] > grid[["i"]], ]

PS:如果你想,例如计算距离,使用矩阵比使用数据框更好。

【讨论】:

  • 我接受了它,因为它回答了我所问的问题 - 感谢您写下这篇文章!不过我会坚持使用循环,因为我需要基于原始 df 应用几个函数(例如两个 lang 的地理距离),我不知道如何使用网格来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多