Перебирать столбцы, применяя функцию между выбранными столбцами - PullRequest
0 голосов
/ 07 ноября 2018

Данные:

dat <- data.frame(id = "T2", Height = 1.2, 
              Number_2 = 1, node_age_2 = 0, 
              Number_3 = 1, node_age_3 = 1, 
              Number_4 = 1, node_age_4 = 2)

Мне нужно перебрать этот фрейм данных, применяя сложную серию функций. Я не уверен в цикле по каждому столбцу и как реализовать. Шаги, которые я представляю себе:

  1. Начать с самого низкого значения столбца Number_2:node_age_2
  2. Применить функцию Answer_2 = Number_2 + node_age_2
  3. Применить функцию Answer_3 = Number_3 + node_age_3
  4. if (Answer_3 < Answer_2){Answer_3} ELSE {Answer_2}
  5. Продолжить последовательно конец кадра данных.

В итоге конечный продукт будет выглядеть примерно так:

id Height Number_2 node_age_2 Answer_2 Number_3 node_age_3 Answer_3 Number_4 node_age_4 Answer_4
1 T2    1.2        1          0        1        1          1        1       1          2        1

Я значительно упростил эту функцию. Мой истинный набор данных намного больше этого (115 наборов переменных) и фактически содержит много разных столбцов в каждом номере. Мне просто нужно понять этот простой пример, чтобы начать. Таким образом, идея состоит в том, чтобы пройтись без вызова каждого имени.

1 Ответ

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

Если вы преобразуете свои данные в «длинный» формат, вы можете получить суммы с помощью операции группировки

library(tidyverse)

Answers <- 
  dat %>% 
    gather(key = 'NumNode', value = 'value', Number_2:node_age_4) %>% 
    group_by(grp = parse_number(NumNode)) %>% 
    do(Answer = with(.data, value[grep('Num', NumNode)] + value[grep('node', NumNode)]))

# # A tibble: 3 x 2
#     grp Answer
#   <dbl>  <dbl>
# 1  2.00   1.00
# 2  3.00   2.00
# 3  4.00   3.00

Тогда ваша логика if может быть реализована простым accumulate использованием min

answers <- accumulate(Answers$Answer, pmin)
# [1] 1 1 1

Вы можете добавить результаты в виде столбцов dat с помощью

dat[paste0('Answer_', Answers$grp)] <- ifelse(is.list(answers), answers, as.list(answers))

Пример данных, имеющих> 1 строку

dat <- data.frame(id = "T2", Height = 1.2, 
              Number_2 = 1:2, node_age_2 = 0:1, 
              Number_3 = 1:2, node_age_3 = 1:2, 
              Number_4 = 1:2, node_age_4 = 2:3)

Вывод из метода выше

  id Height Number_2 node_age_2 Number_3 node_age_3 Number_4 node_age_4 Answer_2 Answer_3 Answer_4
1 T2    1.2        1          0        1          1        1          2        1        1        1
2 T2    1.2        2          1        2          2        2          3        3        3        3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...