У меня есть список (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
вместо этого?