我想根据另一列中的值从一列中检索值。我已经提供了一个例子,它应该有助于解释。
在本例中,如果我们想要返回index格式的值,而number中的下一个值小于或等于当前数字-10,那么我们将获得列ind_return
index number ind_return
1 A 100 C
2 B 105 C
3 C 84 NA
4 D 90 G
5 E 120 F
6 F 110 G
7 G 75 NA
df <- data.frame(index = c("A", "B", "C", "D", "E", "F", "G"),
number = c(100, 105, 84, 90, 120, 110, 75))问题是,我们如何才能获得ind_return
发布于 2021-06-14 18:10:22
您可以使用outer来获取差异。排除upper.tri和diag,然后在apply中使用which获取行。
i <- outer(df$number, df$number, "-")
i[upper.tri(i)] <- NA
diag(i) <- NA
df$index[apply(i < -9, 2, function(x) which(x)[1])]
#[1] "C" "C" NA "G" "F" "G" NA 或者在sapply循环中进行比较
sapply(1:nrow(df), function(i) {
df$index[i+which(df$number[i+seq_len(nrow(df)-i)] - df$number[i] < -9)[1]]
})
#[1] "C" "C" NA "G" "F" "G" NA 发布于 2021-06-14 18:36:34
您可以在tidyverse中使用以下解决方案。作为对我的解决方案如何工作的描述:
这基本上是一个逐行操作,在每次迭代中,我们通过-c(seq(.y - 1))
number和index变量之前的值,我们迭代了2个变量,这里我选择了map2 purrr包中的函数。这里,.x表示每一行中第一个变量index的相应值,.y等于第二个变量.y的相应值library(dplyr)
library(purrr)
df %>%
mutate(id = row_number()) %>%
rowwise() %>%
mutate(ind_return =
map2_chr(number, id, ~ df$index[-c(seq(.y - 1))][which(df$number[-c(seq(.y - 1))] <= .x - 10)][1]))
# A tibble: 7 x 4
# Rowwise:
index number id ind_return
<chr> <dbl> <int> <chr>
1 A 100 1 C
2 B 105 2 C
3 C 84 3 NA
4 D 90 4 G
5 E 120 5 F
6 F 110 6 G
7 G 75 7 NA 发布于 2021-06-14 18:45:41
这是另一个使用dplyr和purrr的版本,我认为它比Anoushiravan R的版本更容易阅读:
library(dplyr)
library(purrr)
filter_it <- function(the_letter){
df %>%
filter(index >= the_letter) %>%
filter(number <= .$number[1] - 10) -> filtered
ifelse(nrow(filtered) == 0, NA, filtered$index[1])
}
df %>%
mutate(ind_return = map_chr(index, filter_it))
index number ind_return
1 A 100 C
2 B 105 C
3 C 84 <NA>
4 D 90 G
5 E 120 F
6 F 110 G
7 G 75 <NA>https://stackoverflow.com/questions/67968320
复制相似问题