首页 > 解决方案 > 如何从变量中获取第一个和最后一个非Inf、非NaN、非NA、非0值?

问题描述

这是我的玩具数据集:

    df <- tibble::tribble(
   ~data, ~first_non_0, ~last_non_0,
       0,         100,        430,
NA_real_,         100,        430,
     NaN,         100,        430,
     Inf,         100,        430,
     100,         100,        430,
     120,         100,        430,
     430,         100,        430,
     NaN,         100,        430,
     Inf,         100,        430,
       0,         100,        430,
NA_real_,         100,        430)

我想得到

  1. 第一个非零、非 NA、非 NaN、非 Inf 值,如第 2 列所示
  2. 最后一个非零、非 NA、非 NaN、非 Inf 值,如第 3 列所示

受此答案的启发,我尝试了类似的方法,但不确定如何处理 NaN 和 Inf:

df %>% 
  mutate(first = na_if(data, 0) %>% 
           na_if(data, NaN) %>% 
           na_if(data, Inf) %>% 
           na.omit() %>% 
           dplyr::first(),
         last  = na_if(data, 0) %>% 
           na_if(data, NaN) %>% 
           na_if(data, Inf) %>% 
           na.omit() %>%
           dplyr::last())

标签: rdataframetidyversenanna

解决方案


如果你所有的价值观都是积极的,你可以使用df$data > 0作为一个条件,然后你只需要处理Infinite,即

i1 <- which(df$data > 0 & !is.infinite(df$data))

df$data[i1[1]]
#[1] 100
df$data[i1[length(i1)]]
#[1] 430

如果您也有负值,您可以将条件从大于切换为不等于(@markus 的赞美)

i1 <- which(df$data != 0 & !is.infinite(df$data))

推荐阅读