在 tibble 中循环遍历行时创建新变量

Creating a new variable while looping over rows in a tibble

我一直在研究整个 tidyverse 生态系统(只是一点点),我一直想知道如何用它解决以下问题。 更一般地说,我一直想知道如何在 transmute 中编写自定义函数来处理(循环)行

我的问题:我想计算数据集最后一行与所有其他行之间的距离度量。之后,我想将带有距离度量的向量添加到我的数据中。

这是我尝试以非 tidyverse 方式做的最小可重现示例

data(iris)
mydata <- iris[, -5]

mydata$distance <- sapply(1:nrow(mydata), function(j){
  dist(rbind(mydata[nrow(mydata), ], mydata[j, ]))})

这行得通,满足了我的需要。

但是,我的 tidyverse 解决方案尝试失败了,我一直在努力解决这个问题 - 非常感谢您的帮助!

mydata <- select(iris, -Species)
mydata %>% transmute(function(x){
 for (i in 1:nrow(x)) {
    dist(rbind(x[i, ],x[nrow(x), ]))
 }
})

非常感谢!

如果您希望将矢量添加到您的数据中,您需要使用 mutate 而不是 transmutetransmute 仅返回单个结果,而 mutate 将列添加到数据中。

您的原始功能也可以正常工作,但如果您想完整使用 tidyverse,您需要将 sapply 换成 map_dbl(来自 purrr), rbind bind_rows

mydata <- select(iris, -Species) %>% 
  mutate(distance = map_dbl(1:nrow(mydata), ~dist(bind_rows(mydata[nrow(mydata), ], mydata[.x, ]))))