R: применить функцию построчно к таблице, передавая значения из справочной таблицы в качестве аргументов - PullRequest
2 голосов
/ 16 мая 2019

Вот проблема итерации по строкам, которую я пытался решить с помощью purrr :: pmap, но не повезло.

Я начну с таблицы необработанных результатов:

rawscore_table <- data.frame(rawscore = 10:14, SS1 = NA, SS2 = NA)

  rawscore SS1 SS2
1       10  NA  NA
2       11  NA  NA
3       12  NA  NA
4       13  NA  NA
5       14  NA  NA

Есть два пустых столбца, SS1 и SS2, значения которых я хочу получить, применяя функцию к каждой строке:

SS1 = rawscore + x + y

SS2 = rawscore + x + y

Значения x и y находятся в справочной таблице:

lookup_table <- data.frame(SS = c('SS1', 'SS2'), x = 1:2, y = 3:4)

   SS x y
1 SS1 1 3
2 SS2 2 4

Решение, которое я ищуfor вычислит значения столбца rawscore_table$SS1, найдя значения x и y в строке SS1 lookup_table, и вычислит значения столбца rawscore_table$SS2, найдя значения x и y в строке SS2 lookup_table.

Таким образом, код должен ссылаться на имя столбца в rawscore_table для получения значенийиз соответствующей строки из lookup_table.

Желаемый результат выглядит следующим образом:

  rawscore   SS1   SS2
1       10    14    16
2       11    15    17
3       12    16    18
4       13    17    19
5       14    18    20

Заранее спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Можно было бы получить rowSums числовых столбцов таблицы lookup_table, добавить (+) с первым столбцом rawscore_table, присвоить выходные данные столбцам, кроме первого столбца * 1003. *

rawscore_table[-1] <- lapply(as.list(rowSums(lookup_table[-1])), `+`, 
           rawscore_table[,1])

Или скопируйте вывод rowSums и добавьте в первый столбец

rawscore_table[as.character(lookup_table$SS)] <- rawscore_table$rawscore + 
            rep(rowSums(lookup_table[-1]), each = nrow(rawscore_table))

Или используя tidyverse

library(tidyverse)
lookup_table %>% 
    transmute(SS, xy = x + y) %>%
    deframe %>%
    as.list %>%
    imap_dfc(~ 
             rawscore_table  %>%
                 transmute(!! .y :=  .x + rawscore)) %>% 
    bind_cols(rawscore_table[1], .)
#   rawscore SS1 SS2
#1       10  14  16
#2       11  15  17
#3       12  16  18
#4       13  17  19
#5       14  18  20
1 голос
/ 16 мая 2019

Другой вариант - присоединиться к rawscore и lookup:

rawscore_table %>%
  gather(SS, val, -rawscore) %>%
  left_join(lookup_table, by = 'SS') %>%
  mutate(val = rawscore + x + y, x = NULL, y = NULL) %>%
  spread(SS, val)

#  rawscore SS1 SS2
#1       10  14  16
#2       11  15  17
#3       12  16  18
#4       13  17  19
#5       14  18  20
...