根据另一个数据帧的向量中的信息提取列表元素
Pulling elements of list based on information in vectors of another dataframe
我有一个列表 (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
中没有确切的字母名称,有没有办法select之前或之后的下一个最接近的字母col1
或 col2
中的字母分别是?例如,如果它试图从 col1
中查找字母 N
,我如何才能将它改为 select K
?同样,如果它试图从 col2
中查找 U
,我怎样才能让它查找 W
呢?
我明白了。我不得不对 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))</pre>
我有一个列表 (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
中没有确切的字母名称,有没有办法select之前或之后的下一个最接近的字母col1
或 col2
中的字母分别是?例如,如果它试图从 col1
中查找字母 N
,我如何才能将它改为 select K
?同样,如果它试图从 col2
中查找 U
,我怎样才能让它查找 W
呢?
我明白了。我不得不对 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))</pre>