Nano Hash - криптовалюты, майнинг, программирование

Почему я должен везде использовать `[[1]]` с data.table?

После индексации столбца DT с именем переменной данные возвращаются как тип data.table data.frame, а столбец не является доступным вектором, я должен сначала удалить его из списка. Все ли я делаю, как задумано?
Рассмотрим этот пример:

require(data.table)
DT <- data.table(a=seq(1.001, 10.999, length=100), b=factor(c(rep('a', 55), rep('b', 45))))
col.name <- 'a'
diff(DT[, col.name]) #column name not found error
diff(DT[, col.name, with=FALSE]) #null data table
diff(DT[, col.name, with=FALSE][[1]]) #works

Второй пример - о чем идет речь.


  • Может попробовать: as.data.frame(DT)[, col.name] 08.09.2020
  • DT[, 'a', with = FALSE] возвращает data.table с одним столбцом 'a', DT$a возвращает вектор - вот как это работает 08.09.2020
  • Вот еще один способ: diff(DT[[col.name]]) 08.09.2020
  • @inscaven, как мне использовать имя столбца переменной с оператором $? [at] ismirsehregal, да, это правильный ответ. 08.09.2020
  • для тех, кто не любит квадратные скобки: diff(getElement(DT, col.name)) 08.09.2020
  • и кстати. вместо with = FALSE можно использовать DT[, ..col.name] 08.09.2020
  • @ ivan866, хотя $ не предназначен для поддержки имен переменных для подмножества ([[ is), вот несколько способов: library(rlang); eval_tidy(expr(`$`(DT, !!col.name))) или setnames(DT, old = col.name, new = "column_to_extract")$column_to_extract, если не предложите простое, но не рекомендуемое решение с eval(parse(text = paste0("DT$", col.name))) 08.09.2020

Ответы:


1

У вас есть много вариантов для получения отдельных столбцов. На мой взгляд, наиболее читаемый вариант - использование .SD, хотя и не самый быстрый. Также часто требуется, чтобы отдельные столбцы data.table не преобразовывались в векторы.

require(data.table)
DT <- data.table(a=seq(1.001, 10.999, length=100), b=factor(c(rep('a', 55), rep('b', 45))))

DT[ , get(col.name) ] # vector
DT[[ col.name ]] # vecotr
DT[ , col.name, with = FALSE ] # data.table
DT[ , .SD, .SDcols = col.name ] # data.table
08.09.2020

2

Два (простых) способа получить только вектор, а не таблицу data.table с учетом ваших входных данных:

DT[, get(col.name)]
DT[[col.name]] # as per comment by ismirsehregal 

И некоторые столь же запутанные, как DT[, col.name, with=FALSE][[1]]

with(DT, eval(parse(text=col.name)))
DT[, ..col.name][[1]] # as per comment by ismirsehregal 
08.09.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..