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

Расширение таблицы частот, где имена переменных являются значениями

Я работаю с фреймом данных, где каждое наблюдение связано с определенным идентификатором, и у меня есть набор переменных, которые определяют «значения», как если бы у меня была факторная переменная. Однако значение в «ячейке» - это частота. Вот упрощенная версия:

ID  1  2  3
A   2  3  2
B   1  4  1

Я хотел бы получить два вектора, которые расширяют частоты, чтобы я мог вычислить интерполированную медиану для каждого идентификатора. То есть мне нужно что-нибудь в форме:

A  B
1  1
1  2
2  2
2  2
2  2
3  3
3

В пакете psych есть функция interp.median, которая затем может брать каждый вектор и возвращать интерполированную медиану для каждого идентификатора, который я хотел бы включить в качестве новой переменной в исходный фрейм данных. Я проверил пакет vcdExtra, который, возможно, мог бы сделать это с помощью своей функции expand.dft, но я не уверен, как именно он будет работать.

Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ: Чтобы уточнить немного больше, interp.median будет работать лучше всего, если окончательный результат будет кадром данных с дополнением NA в конце. То есть что-то вроде:

A  B
1  1
1  2
2  2
2  2
2  2
3  3
3  NA
27.08.2014

Ответы:


1

Если dat - это набор данных

  lst <- by(dat[,-1], dat[,1], function(x) rep(seq_along(x), x))
  lst
  #dat[, 1]: A
  #[1] 1 1 2 2 2 3 3
  #------------------------------------------------------------ 
 #dat[, 1]: B
 #[1] 1 2 2 2 2 3

 indx <- max(sapply(lst,length))
 dat2 <- do.call(data.frame,lapply(lst, function(x) c(x,rep(NA,indx-length(x)))))
 dat2
 #  A  B
 #1 1  1
 #2 1  2
 #3 2  2
 #4 2  2
 #5 2  2
 #6 3  3
 #7 3 NA

Or

  lst2 <- lapply(split(dat[,-1], dat$ID), function(x) rep(seq_along(unlist(x)), unlist(x)))

  do.call(data.frame,lapply(lst2, function(x) c(x,rep(NA,indx-length(x)))))

данные

 dat <-  structure(list(ID = c("A", "B"), `1` = c(2L, 1L), `2` = 3:4, 
`3` = c(2L, 1L)), .Names = c("ID", "1", "2", "3"), class = "data.frame", row.names = c(NA, 
 -2L))
27.08.2014
  • Я думаю, что второй вариант будет работать до тех пор, пока я могу дополнить каждый элемент списка НА в конце, чтобы все было одинаковой длины для преобразования в фрейм данных. Предложения, как это сделать? 27.08.2014
  • Превосходно! Я протестировал еще несколько примеров наборов данных. Я думаю, это хорошо сработает. 28.08.2014

  • 2

    Вот один способ:

    # your data
    df <- data.frame(ID=c(1,2,3), A=c(2,3,2), B=c(1,4,1))
    
    # function to repeat each ID a given number of times,
    # as specified in 'colname' of df
    rep_id <- function(colname) {
      unname(unlist(apply(df[, c('ID',colname)], 1, function(x) rep(x[1], x[2]))))
    }
    
    # apply this function to all columns (except the first, which is ID)
    sapply(names(df)[-1], rep_id)
    

    Урожайность:

    $A
    [1] 1 1 2 2 2 3 3
    
    $B
    [1] 1 2 2 2 2 3
    
    27.08.2014

    3

    Образец данных:

    df <- read.table(text="
    ID  1  2  3
    A   2  3  2
    B   1  4  1", header=TRUE, check.names=FALSE)
    

    Используйте apply:

    (newlist <- apply(df[2:4], 1, function(x) rep(names(x), x)))
    #[[1]]
    #[1] "1" "1" "2" "2" "2" "3" "3"
    #
    #[[2]]
    #[1] "1" "2" "2" "2" "2" "3"
    
    names(newlist) <- df$ID
    #$A
    #[1] "1" "1" "2" "2" "2" "3" "3"
    #
    #$B
    #[1] "1" "2" "2" "2" "2" "3"
    

    Это выводит символы, но вы можете выводить такие числа:

    newlist <- apply(df[2:4], 1, function(x) rep(as.numeric(names(x)), x))
    names(newlist) <- df$ID
    

    Редактировать:

    Чтобы ответить на новый запрос OP о том, что векторы должны быть помещены в data.frame и дополнены NA, вызовите его после выполнения любого из указанных выше вариантов:

    newlist <- sapply(newlist, function(x) x[1:max(sapply(newlist, length))])
    #     A  B
    #[1,] 1  1
    #[2,] 1  2
    #[3,] 2  2
    #[4,] 2  2
    #[5,] 2  2
    #[6,] 3  3
    #[7,] 3 NA
    
    27.08.2014
    Новые материалы

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

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

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

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

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

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

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