R векторизовать сравнение со списками начального и конечного векторов соответственно - PullRequest
0 голосов
/ 11 января 2020

У меня есть:

  • кадр данных DATA, содержащий множество чисел c столбцов с именами: X1, X2, X3, ... (количество столбцов является переменным)
  • цифр c векторы start1, start2, start3, ... (столько же, сколько столбцы DATA) и End1, End2, End3, ... (столько же, сколько столбцы DATA)

Я хочу добавить столбец с именем Result to DATA, где n-й элемент Результата: DATA$Result[n] равен TRUE, если выполняются все следующие условия:

  • n-е значение DATA$X1 находится между start1[n] и End1[n] и
  • n-е значение DATA$X2 находится между start2[n] и End2[n] и ....

Как я могу это сделать?

1 Ответ

2 голосов
/ 11 января 2020

Один из вариантов - загрузить все векторы 'start', 'end' в list, а затем использовать Map для выполнения соответствующего столбца, сравнение 'start', 'end'

startLst <- mget(ls(pattern = "^start\\d+$"))
endLst <- mget(ls(pattern = "^End\\d+$"))
xcols <- grep("^X\\d+", names(DATA), value = TRUE)
resultcols <- sub("^X", "Result", xcols)
DATA[resultcols] <- Map(function(vec, st, ed) vec >= st & vec < ed, 
            DATA[xcols], startLst, endLst)

Также можно обойтись без oop

DATA[resultcols] <-  DATA[xcols] >= do.call(cbind, startLst) & 
                     DATA[xcols] < do.call(cbind, endLst)

ПРИМЕЧАНИЕ. Здесь мы предполагаем, что length каждого вектора 'start', 'end' совпадает с количество строк 'DATA'


Или это можно сделать в tidyverse как

library(dplyr)
library(purrr)
pmap_dfc(list(DATA[xcols],
          startLst,
           endLst), ~ ..1 >= ..2 & ..1 < ..3)) %>%
    rename_all(~ resultcols) %>%
    bind_cols(DATA, .)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...