确定R中向量中元素周围的区域

cl25kdpy  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(109)

假设我们有以下指标向量:

library(dplyr)
tibble(row = 1:20,
       indicator = rep(c(rep(0, 5), 1, rep(0, 4)), 2))

     row indicator
   <int>     <dbl>
 1     1         0
 2     2         0
 3     3         0
 4     4         0
 5     5         0
 6     6         1
 7     7         0
 8     8         0
 9     9         0
10    10         0
11    11         0
12    12         0
13    13         0
14    14         0
15    15         0
16    16         1
17    17         0
18    18         0
19    19         0
20    20         0

如何轻松地创建一个列,指示指示器列周围的区域。例如,如果我想创建三个大小为N = 1,3和5的“区域”,那么所需的输出应该如下所示:

row indicator region_n1 region_n3 region_n5
   <int>     <dbl>     <dbl>     <dbl>     <dbl>
 1     1         0         0         0         0
 2     2         0         0         0         0
 3     3         0         0         0         0
 4     4         0         0         0         1
 5     5         0         0         1         1
 6     6         1         1         1         1
 7     7         0         0         1         1
 8     8         0         0         0         1
 9     9         0         0         0         0
10    10         0         0         0         0
11    11         0         0         0         0
12    12         0         0         0         0
13    13         0         0         0         0
14    14         0         0         0         1
15    15         0         0         1         1
16    16         1         1         1         1
17    17         0         0         1         1
18    18         0         0         0         1
19    19         0         0         0         0
20    20         0         0         0         0

当指标变量中只有一个“1”时,我可以通过排序对此进行编码,但当有多个“1”时,我会很挣扎。

ilmyapht

ilmyapht1#

laglead使用用户定义函数:

get_region_n <- function(x,n){
  if(n==1){
    return(x)
  }else{
    new_n <- (n-1)/2
    new_x <- x
    for(i in new_n:1){
      new_x <- new_x+lag(x,n=i,default=0)+lead(x,n=i,default=0)
    }
    return(new_x)
  }
}

df%>%mutate(region_n1=get_region_n(indicator,1),
            region_n3=get_region_n(indicator,3),
            region_n5=get_region_n(indicator,5))

     row indicator region_n1 region_n3 region_n5
   <int>     <dbl>     <dbl>     <dbl>     <dbl>
 1     1         0         0         0         0
 2     2         0         0         0         0
 3     3         0         0         0         0
 4     4         0         0         0         1
 5     5         0         0         1         1
 6     6         1         1         1         1
 7     7         0         0         1         1
 8     8         0         0         0         1
 9     9         0         0         0         0
10    10         0         0         0         0
11    11         0         0         0         0
12    12         0         0         0         0
13    13         0         0         0         0
14    14         0         0         0         1
15    15         0         0         1         1
16    16         1         1         1         1
17    17         0         0         1         1
18    18         0         0         0         1
19    19         0         0         0         0
20    20         0         0         0         0
r8xiu3jd

r8xiu3jd2#

在Base R中,你可以:

v <- c(1,3,5)
names(v) <- paste0("region_n", v)
add <- sapply(v, \(x)c(stats::filter(df$indicator, rep(1, x))))
cbind(df, replace(add, is.na(add), 0))

#>    row indicator region_n1 region_n3 region_n5
#> 1    1         0         0         0         0
#> 2    2         0         0         0         0
#> 3    3         0         0         0         0
#> 4    4         0         0         0         1
#> 5    5         0         0         1         1
#> 6    6         1         1         1         1
#> 7    7         0         0         1         1
#> 8    8         0         0         0         1
#> 9    9         0         0         0         0
#> 10  10         0         0         0         0
#> 11  11         0         0         0         0
#> 12  12         0         0         0         0
#> 13  13         0         0         0         0
#> 14  14         0         0         0         1
#> 15  15         0         0         1         1
#> 16  16         1         1         1         1
#> 17  17         0         0         1         1
#> 18  18         0         0         0         1
#> 19  19         0         0         0         0
#> 20  20         0         0         0         0

创建于2023-04-14带有reprex v2.0.2
注意,我使用stats::是因为还有dplyr::filter,并且可能dplyr已经加载到您的终端,这从stats包中屏蔽了filter

相关问题