首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列中的下一个值,小于或等于与当前值的差值

列中的下一个值,小于或等于与当前值的差值
EN

Stack Overflow用户
提问于 2021-06-14 18:03:32
回答 3查看 114关注 0票数 3

我想根据另一列中的值从一列中检索值。我已经提供了一个例子,它应该有助于解释。

在本例中,如果我们想要返回index格式的值,而number中的下一个值小于或等于当前数字-10,那么我们将获得列ind_return

代码语言:javascript
复制
   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

EN

回答 3

Stack Overflow用户

发布于 2021-06-14 18:10:22

您可以使用outer来获取差异。排除upper.tridiag,然后在apply中使用which获取行。

代码语言:javascript
复制
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循环中进行比较

代码语言:javascript
复制
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 
票数 4
EN

Stack Overflow用户

发布于 2021-06-14 18:36:34

您可以在tidyverse中使用以下解决方案。作为对我的解决方案如何工作的描述:

这基本上是一个逐行操作,在每次迭代中,我们通过-c(seq(.y - 1))

  • Since删除了numberindex变量之前的值,我们迭代了2个变量,这里我选择了map2 purrr包中的函数。这里,.x表示每一行中第一个变量index的相应值,.y等于第二个变量.y的相应值

代码语言:javascript
复制
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   
票数 3
EN

Stack Overflow用户

发布于 2021-06-14 18:45:41

这是另一个使用dplyrpurrr的版本,我认为它比Anoushiravan R的版本更容易阅读:

代码语言:javascript
复制
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>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67968320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档