Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何从变量中获取第一个和最后一个非Inf、非NaN、非NA、非0值?_R_Dataframe_Tidyverse_Nan_Na - Fatal编程技术网

R 如何从变量中获取第一个和最后一个非Inf、非NaN、非NA、非0值?

R 如何从变量中获取第一个和最后一个非Inf、非NaN、非NA、非0值?,r,dataframe,tidyverse,nan,na,R,Dataframe,Tidyverse,Nan,Na,这是我的玩具数据集: 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, 43

这是我的玩具数据集:

    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)

如果所有值都为正值,则可以使用df$data>0作为条件,然后只需处理无限,即

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

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

如果所有值都为正值,则可以使用df$data>0作为条件,然后只需处理无限,即

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

i1 <- which(df$data != 0 & !is.infinite(df$data))
另一种选择:

f <- function(x) {
  cond <- x != 0 & !is.na(x) & is.finite(x) & !is.nan(x)
  tmp <- x[cond]
  as.list(tmp[c(1, length(tmp))])
}
注意:该条件可以简化,请参阅

将函数应用于该列,并将值作为新列插入

df[, c("var1", "var2")] <- f(df$data)
结果

df
# A tibble: 11 x 5
#    data first_non_0 last_non_0  var1  var2
#   <dbl>       <dbl>      <dbl> <dbl> <dbl>
# 1     0         100        430   100   430
# 2    NA         100        430   100   430
# 3   NaN         100        430   100   430
# 4   Inf         100        430   100   430
# 5   100         100        430   100   430
# 6   120         100        430   100   430
# 7   430         100        430   100   430
# 8   NaN         100        430   100   430
# 9   Inf         100        430   100   430
#10     0         100        430   100   430
#11    NA         100        430   100   430
另一种选择:

f <- function(x) {
  cond <- x != 0 & !is.na(x) & is.finite(x) & !is.nan(x)
  tmp <- x[cond]
  as.list(tmp[c(1, length(tmp))])
}
注意:该条件可以简化,请参阅

将函数应用于该列,并将值作为新列插入

df[, c("var1", "var2")] <- f(df$data)
结果

df
# A tibble: 11 x 5
#    data first_non_0 last_non_0  var1  var2
#   <dbl>       <dbl>      <dbl> <dbl> <dbl>
# 1     0         100        430   100   430
# 2    NA         100        430   100   430
# 3   NaN         100        430   100   430
# 4   Inf         100        430   100   430
# 5   100         100        430   100   430
# 6   120         100        430   100   430
# 7   430         100        430   100   430
# 8   NaN         100        430   100   430
# 9   Inf         100        430   100   430
#10     0         100        430   100   430
#11    NA         100        430   100   430

从@Sotos和@markus使用的is.finite和他们的讨论中获取线索,我检查了一下,得到了答案。谢谢你们两个

is.finite(c(NA_real_, NaN, Inf))

df %>% 
  mutate(first = na_if(data, 0),
         first = if_else(is.finite(first), first, NA_real_),
         first = first(na.omit(first))) %>% 
  mutate(last = na_if(data, 0),
         last = if_else(is.finite(last), last, NA_real_),
         last = last(na.omit(last)))
结果:

# A tibble: 11 x 5
    data first_non_0 last_non_0 first  last
   <dbl>       <int>      <int> <dbl> <dbl>
 1     0         100        430   100   430
 2    NA         100        430   100   430
 3   NaN         100        430   100   430
 4   Inf         100        430   100   430
 5   100         100        430   100   430
 6   120         100        430   100   430
 7   430         100        430   100   430
 8   NaN         100        430   100   430
 9   Inf         100        430   100   430
10     0         100        430   100   430
11    NA         100        430   100   430

从@Sotos和@markus使用的is.finite和他们的讨论中获取线索,我检查了一下,得到了答案。谢谢你们两个

is.finite(c(NA_real_, NaN, Inf))

df %>% 
  mutate(first = na_if(data, 0),
         first = if_else(is.finite(first), first, NA_real_),
         first = first(na.omit(first))) %>% 
  mutate(last = na_if(data, 0),
         last = if_else(is.finite(last), last, NA_real_),
         last = last(na.omit(last)))
结果:

# A tibble: 11 x 5
    data first_non_0 last_non_0 first  last
   <dbl>       <int>      <int> <dbl> <dbl>
 1     0         100        430   100   430
 2    NA         100        430   100   430
 3   NaN         100        430   100   430
 4   Inf         100        430   100   430
 5   100         100        430   100   430
 6   120         100        430   100   430
 7   430         100        430   100   430
 8   NaN         100        430   100   430
 9   Inf         100        430   100   430
10     0         100        430   100   430
11    NA         100        430   100   430

@马库斯:没有。这个技巧是通过声明数据>0来实现的,它返回TRUE、FALSE或NA。在无限的情况下,它返回TRUE,因为Inf>0,因此额外的is.infinite conditionAh我看到了。聪明的可能会将第一个检查更改为df$data!=如果OP也处理负值,则为0?@markus它不处理。这个技巧是通过声明数据>0来实现的,它返回TRUE、FALSE或NA。在无限的情况下,它返回TRUE,因为Inf>0,因此额外的is.infinite conditionAh我看到了。聪明的可能会将第一个检查更改为df$data!=如果OP也处理负值,则为0?