Получение элементов списка на основе информации в векторах другого информационного кадра - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть список (my.list) и фрейм данных (my.dataframe). Имена каждого элемента в my.list имеют последовательность и того же типа, что и элементы в двух переменных в my.dataframe. Я хочу вытащить элементы списка, чьи имена находятся внутри, внутри или за пределами диапазона элементов двух столбцов в my.dataframe.

RNGkind('Mersenne-Twister')
set.seed(1)

#Create my.dataframe
my.letters <- sample(x = sample(LETTERS[1:20], 
                                size = 13, 
                                replace = FALSE), 
                     size = 100, 
                     replace = TRUE)
my.other.letters <- LETTERS[match(my.letters, LETTERS) + 
                        sample(x = 0:5,
                               size = 100, 
                               replace = TRUE)]
my.dataframe <- data.frame(col1 = my.letters, 
                           col2 = my.other.letters)

head(my.dataframe)
  col1 col2
1    D    F
2    C    C
3    O    O
4    A    E
5    T    T
6    D    F
#So here, I'd want to pull out elements within my.list who's names would fall within D 
#and F for the first row, C for the second row, O for the fourth, A and E for the fifth,
#so on and so forth.

#Create my.list
temp.data <- data.frame(a = rnorm(13*20, 10, 1), 
                        b = rep(LETTERS[sample(1:length(LETTERS), 
                                        size = 13, 
                                        replace = FALSE)], 
                                each = 20))
my.list <- split(x = temp.data$a, f = factor(temp.data$b))

Я использовал mapply(), чтобы попытаться сделать это:

mega.list <- mapply(function(f, s)my.list[which(LETTERS == f):which(LETTERS == s)], f = my.dataframe$col1, s = my.dataframe$col2)

Но это работает, только если col1, col2, а имена элементов в my.list имеют все буквы алфавита, но они не имеют. Если вы посмотрите на mega.list[[98]], у вас будет пустой список, потому что он ищет имена в my.list, которые находятся между T и Y (my.dataframe[98,]). Если нет элемента списка с именем T, вы ничего не получите.

sort(unique(as.character(my.dataframe$col1))); sort(unique(as.character(my.dataframe$col2))); sort(unique(names(my.list)))
[1] "A" "B" "C" "D" "F" "H" "I" "K" "N" "O" "P" "S" "T"
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "X" "Y"
[1] "A" "B" "D" "E" "F" "G" "H" "J" "K" "R" "S" "W" "Z"

Вопрос: Если точное имя буквы недоступно в my.list, есть ли способ выбрать следующую ближайшую букву до или после букв в col1 или col2 соответственно ? Например, если он пытается найти букву N из col1, как я могу получить вместо нее K? Аналогично, если он пытается найти U из col2, как я могу заставить его искать W вместо этого?

1 Ответ

0 голосов
/ 30 апреля 2019

Я понял это. Мне пришлось внести поправку в функцию mapply, где первая функция which ищет все буквы и до и до f и принимает последнее значение (с помощью функции tail) и где последнее which Функция просматривает все буквы в и после нее и берет первую (сделано с [1]).

<code>mega.list <- mapply(function(f, s)my.list[tail(which(names(my.list) <= f), n = 1):which(names(my.list) >= s)[1]], f = as.character(my.dataframe$col1), s = as.character(my.dataframe$col2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...