Хобрук: Ваш путь к мастерству в программировании

Лучший способ применить эту функцию к каждой строке кадра данных?

Я хотел бы применить функцию к каждой строке фрейма данных, как показано ниже. Я знаю, как использовать apply в случае, когда фрейм данных содержит только числа, но что, если строки содержат, скажем, булевы/логические значения, строки и целые числа? Пример:

df <- data.frame(x=1:10,
                 y=c(TRUE, FALSE),
                 z=letters[1:10],
                 stringsAsFactors=FALSE)

RowFunction <- function(row) {
  if (row$y) return(row$x)
  return (row$z)
}

sapply(1:dim(df)[1], function(i) { RowFunction(df[i, ]) })

Есть лучший способ сделать это? Моя первая мысль состояла в том, чтобы использовать apply(df, 1, RowFunction) после добавления row <- as.list(row) в начало RowFunction, но это не работает, потому что apply приводит df к массиву, который не может обрабатывать строки, содержащие разные типы данных.

Просто для моего знания R я хотел бы знать, есть ли более чистый способ сделать это, чем sapply(1:dim(df)[1], ... ). Любые идеи?

Заранее спасибо!

r
08.11.2011

  • Я хотел бы отметить, что все элементы в векторе будут иметь один и тот же режим. Единственный способ получить результаты, которые различаются по режиму или типу, — это вернуть список. 09.11.2011

Ответы:


1

В этом случае вы можете просто использовать ifelse:

sapply(1:dim(df)[1], function(i) { RowFunction(df[i, ]) })
 [1] "1" "b" "3" "d" "5" "f" "7" "h" "9" "j"

with(df, ifelse(y, x, z))
 [1] "1" "b" "3" "d" "5" "f" "7" "h" "9" "j"

Для удобства и читабельности я также использовал with — это позволяет обращаться к столбцу просто по имени, без использования оператора $.

08.11.2011
  • +2, если бы я мог, за ifelse и with...2 моих любимых! 09.11.2011

  • 2

    Функция ifelse может сделать это с помощью lapply:

     lapply(df$y, ifelse, df$x, df$z)  # does return list with varying modes
    

    Моя более ранняя (более неуклюжая) версия:

     res <- list()
     for(i in seq_along(rownames(df) ) ) { res <- c(res, df[i,1+2*!df[i,"y"] ]) }
     res
    #--------
    [[1]]
    [1] 1
    
    [[2]]
    [1] "b"
    
    [[3]]
    [1] 3
    
    [[4]]
    [1] "d"
    
    [[5]]
    [1] 5
    
    [[6]]
    [1] "f"
    
    [[7]]
    [1] 7
    
    [[8]]
    [1] "h"
    
    [[9]]
    [1] 9
    
    [[10]]
    [1] "j"
    
    08.11.2011
    Новые материалы

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

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

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..