基于另一个数据帧的向量中的信息来拉取列表的元素

问题描述 投票:0回答:1

我有一个列表(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)

但它只有在col1col2my.list中的元素名称都有字母表中的所有字母时才有效,但它们没有。如果你看一下mega.list[[98]],你就有一个空列表,因为它正在寻找my.listTY)之间的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中没有确切的字母名称,有没有办法在col1col2中分别选择字母之前或之后的下一个最接近的字母?例如,如果它试图从N寻找一个字母col1,我怎么能让它选择K呢?同样,如果它试图从U找到col2,我怎么能让它来寻找W呢?

r list mapply
1个回答
0
投票

我想到了。我不得不对mapply函数进行修正,其中第一个which函数查找所有字母,并且在f之前并且取最后一个值(使用tail函数),最后一个which函数查看其后面的所有字母并采取第一个(与[1]完成)。

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))
© www.soinside.com 2019 - 2024. All rights reserved.