Создание новой переменной в цикле по строкам в таблице - PullRequest
0 голосов
/ 15 ноября 2018

Я углубился во всю экосистему тививерса (чуть-чуть), и мне было интересно, как решить следующую проблему с ней. В общем, мне было интересно, как написать пользовательские функции в transmute, которые работают со строками (зацикливается)

Моя проблема: я хотел бы вычислить метрику расстояния между последней строкой моего набора данных и всеми другими строками. После этого я хотел бы добавить вектор с метриками расстояния к моим данным.

Вот минимально воспроизводимый пример того, что я пытаюсь сделать без обратной связи

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

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

Это работает и дает мне то, что мне нужно.

Однако моя попытка найти решение провалилась, и я бился головой об этой проблеме - был бы признателен за помощь!

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

Большое спасибо!

1 Ответ

0 голосов
/ 15 ноября 2018

Если вы хотите добавить вектор к вашим данным, вам нужно использовать mutate вместо transmute.transmute просто возвращает вам один результат, в то время как 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, ]))))
...