Евклидово расстояние от произвольного количества столбцов

Я пытаюсь вычислить евклидово расстояние на основе произвольного списка столбцов. Я попытался сделать это, чтобы вычислить расстояние между наблюдениями в dt и единственным наблюдением в x. Кажется, все работает так, как и ожидалось, но я получаю предупреждение в строке 4, потому что я не назначаю значения по ссылке.

dt <- data.table(a=1:10, b=11:20, c=21:30)
x <- data.table(a=5, b=6, c=7)
for(i in names(dt)){
  dt[[i]] <- (dt[[i]] - x[1][[i]])^2
}
dt[, euclid := rowSums(.SD), .SDcols=names(dt)]
dt[, euclid := sqrt(euclid)]

Затем я заменил строку 4 на setattr(dt, i, (dt[[i]] - x[1][[i]])^2), но тогда столбцы фактически не обновляются.

Возможно, я неправильно понимаю, как работает setattr(). Я думал, что следующие две строки будут эквивалентны, но, видимо, нет.

dt[, foo := 2]
setattr(dt, "foo", 2)

Я был бы рад любым идеям, а также советам, как сделать это лучше.

У меня есть data.table v1.15.4

setattr устанавливает атрибуты объекта, а не обновляет значения, вы думаете о data.table::set для этого? (Не то чтобы я думаю, что это правильный путь, если честно)
r2evans 05.04.2024 22:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
71
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вот один из подходов, не меняя исходные значения столбца.

cbind(dt, 
  dt[, lapply(names(.SD), \(i) (.SD[,get(i)] - x[,get(i)])^2)][
    , .(euclid = sqrt(rowSums(.SD)))])
        a     b     c   euclid
    <int> <int> <int>    <num>
 1:     1    11    21 15.39480
 2:     2    12    22 16.43168
 3:     3    13    23 17.57840
 4:     4    14    24 18.81489
 5:     5    15    25 20.12461
 6:     6    16    26 21.49419
 7:     7    17    27 22.91288
 8:     8    18    28 24.37212
 9:     9    19    29 25.86503
10:    10    20    30 27.38613
Ответ принят как подходящий

Что-то вроде этого?

cols <- c("a", "b", "c")
dt[, euclid := sqrt(rowSums(mapply(function(a, b) (a-b)^2,
                                   .SD, x[, .SD, .SDcols = cols]))),
    .SDcols = cols]
#         a     b     c   euclid
#     <int> <int> <int>    <num>
#  1:     1    11    21 15.39480
#  2:     2    12    22 16.43168
#  3:     3    13    23 17.57840
#  4:     4    14    24 18.81489
#  5:     5    15    25 20.12461
#  6:     6    16    26 21.49419
#  7:     7    17    27 22.91288
#  8:     8    18    28 24.37212
#  9:     9    19    29 25.86503
# 10:    10    20    30 27.38613

Кажется, что немного Inception нужно использовать x[, .SD] внутри dt[, ...]...

Спасибо. Определенно я впервые вижу x[, .SD] внутри dt[,..] :-)

asahi 06.04.2024 15:05

Наверное, ты можешь попробовать это

> dt[, euclid := sqrt(rowSums((.SD - unlist(x)[col(.SD)])^2))][]
        a     b     c   euclid
    <int> <int> <int>    <num>
 1:     1    11    21 15.39480
 2:     2    12    22 16.43168
 3:     3    13    23 17.57840
 4:     4    14    24 18.81489
 5:     5    15    25 20.12461
 6:     6    16    26 21.49419
 7:     7    17    27 22.91288
 8:     8    18    28 24.37212
 9:     9    19    29 25.86503
10:    10    20    30 27.38613
dt[, euclid := sqrt(colSums((t(.SD) - unlist(x))**2))][]

        a     b     c   euclid
    <int> <int> <int>    <num>
 1:     1    11    21 15.39480
 2:     2    12    22 16.43168
 3:     3    13    23 17.57840
 4:     4    14    24 18.81489
 5:     5    15    25 20.12461
 6:     6    16    26 21.49419
 7:     7    17    27 22.91288
 8:     8    18    28 24.37212
 9:     9    19    29 25.86503
10:    10    20    30 27.38613

Другие вопросы по теме

Похожие вопросы

Фильтрация строк data.frame на основе двух столбцов и внешнего вектора в R
Можно ли использовать сценарии R в качестве источника данных для PowerBI при публикации в службе PowerBI?
Группируйте с помощью str_detect для групп с похожими строками
Как оценить средний доход на душу населения за 10 лет в разных странах в Dataframe?
Многократная детализация Highcharter не работает с использованием разных подходов
Получить номер строки, в которой изменяется значение в столбце
Fixest::coefplot проблема с использованием «keep» и «x» для переименования переменных («Аргумент «x» должен иметь ту же длину, что и количество коэффициентов»)
Как изменить размер символа в ggplot2, если размер, форма и цвет заданы через geom_point?
Преобразование расширяемой спарклайна Plotly в график HighCharter в карте bslib с помощью javascript
Разделение столбца на основе строкового шаблона в R с использованием функций tidyverse