Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.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 按组查找第一个和最后一个NA值的全局索引_R_Na - Fatal编程技术网

R 按组查找第一个和最后一个NA值的全局索引

R 按组查找第一个和最后一个NA值的全局索引,r,na,R,Na,我有一个表格的数据集 #create data.frame df <- data.frame(id = rep(1:3,each=10), value = rnorm(30)) #throw in some NAs df[c(1:5, 25:30),2] <- NA df[1:10,] id value 1 1 NA 2 1 NA 3 1 NA 4 1

我有一个表格的数据集

#create data.frame
df <- data.frame(id    = rep(1:3,each=10),
                 value = rnorm(30))

#throw in some NAs
df[c(1:5, 25:30),2] <- NA 

df[1:10,]
   id      value
1   1         NA
2   1         NA
3   1         NA
4   1         NA
5   1         NA
6   1 -1.0763008
7   1 -0.4026228
8   1  1.6110506
9   1 -1.0626593
10  1 -0.4058101
当我尝试将其与聚合结合使用时,不幸的是,它只返回组中第一个和最后一个非NA值的索引(正如预期的那样):

我的期望输出是第一个和最后一个非NA值的“全局”索引,即

  Group.1 x.1 x.2
1       1   6  10
2       2   11 20
3       3   21 24

任何也适用于超大数据集的解决方案?

主要思想是在分组之前根据行号创建一个变量。使用
dplyr

library(dplyr)

df %>% 
 mutate(rn = row_number()) %>% 
 group_by(id) %>% 
 summarise(v1 = first(rn[!is.na(value)]), 
           v2 = last(rn[!is.na(value)]))
这就给了,

#一个tible:3 x 3
id v1 v2
1     1     6    10
2     2    11    20
3     3    21    24

数据中的@Sotos相同。表

library(data.table)

setDT(df)[!is.na(value), .(x.1 = .I[1], x.2 = .I[.N]), by = id]

   id x.1 x.2
1:  1   6  10
2:  2  11  20
3:  3  21  24

我们首先过滤
df
(在
value
列中)的非缺失值,然后提取每个
id
的第一(
[1]
)和最后(
[.N]
)值的全局行号(
.I
),这是一个使用
聚合
的基本R解决方案

res <- aggregate(value~id, df, function(x) range(which(!is.na(x))),na.action = NULL)
res$value[-1,1] <- res$value[-1,1] + cumsum(res$value[-nrow(res$value),2])
res$value[,2] <- cumsum(res$value[,2])
# A tibble: 3 x 3
     id    v1    v2
  <int> <int> <int>
1     1     6    10
2     2    11    20
3     3    21    24
library(data.table)

setDT(df)[!is.na(value), .(x.1 = .I[1], x.2 = .I[.N]), by = id]

   id x.1 x.2
1:  1   6  10
2:  2  11  20
3:  3  21  24
res <- aggregate(value~id, df, function(x) range(which(!is.na(x))),na.action = NULL)
res$value[-1,1] <- res$value[-1,1] + cumsum(res$value[-nrow(res$value),2])
res$value[,2] <- cumsum(res$value[,2])
> res
  id value.1 value.2
1  1       6      10
2  2      11      20
3  3      21      24