首页 > 解决方案 > 使用 tidyverse 同时过滤、汇总并将结果放入同一数据框的新列中的指定位置

问题描述

在过滤了我想要总结的子集的所有数据之后,我正在尝试将汇总统计的结果添加到同一 tibble 另一列中指定位置的 tibble 中。它包含在网格单元景观中的空间显式模拟结果。我有一列指定景观的列和行以及结果的列。我想要做的是获取目标网格单元,例如row= 2, col =2并计算目标单元格及其周围八个单元格的方差。此结果应存储在数据框的新列中,位于目标网格单元格的行中。过滤数据以仅选择我感兴趣的九个补丁工作正常,但将结果存储在特定位置的新列中不起作用。我需要一个通用的解决方案,因为我想遍历所有网格单元(由 row 和 col 给出)并遍历几个包含相似数据的小标题,但对于不同的景观,我在这里放置示例代码,我的真实数据集很多较大。

data= tibble(row=c(1,1,1, 2,2,2, 3,3,3), col=c(1,2,3, 1,2,3, 1,2,3), x=c(0.5, 0.5, 0.5, 0.4, 0.4, 0.4, 0.3, 0.3, 0.3), cluster_var=0)
> data
# A tibble: 9 x 4
    row   col     x cluster_var
  <dbl> <dbl> <dbl>       <dbl>
1     1     1   0.5           0
2     1     2   0.5           0
3     1     3   0.5           0
4     2     1   0.4           0
5     2     2   0.4           0
6     2     3   0.4           0
7     3     1   0.3           0
8     3     2   0.3           0
9     3     3   0.3           0

比方说,这是包含我的结果的 tibble。现在我想选择目标网格单元格及其八个相邻单元格,例如 row=2,col=2,并计算这九个单元格的 x 方差,所以我这样做了:

i_row=2
i_col=2

  data%>%filter(row==(i_row-1) | row == (i_row+1) | row==i_row) %>% 
  filter(col==(i_col-1) | col==(i_col+1) | col==i_col) %>% 
  summarise(var(x))
# A tibble: 1 x 1
  `var(x)`
     <dbl>
1   0.0075

现在我想把它存储data$cluster_var在行中, whererow=2col=2,所以结果 tibble 将是:

> data
# A tibble: 9 x 4
    row   col     x cluster_var
  <dbl> <dbl> <dbl>       <dbl>
1     1     1   0.5           0
2     1     2   0.5           0
3     1     3   0.5           0
4     2     1   0.4           0
5     2     2   0.4           0.0075
6     2     3   0.4           0
7     3     1   0.3           0
8     3     2   0.3           0
9     3     3   0.3           0

当然,我需要遍历rowand的所有可能值col来填充整个列,cluster_var而真实的数据集非常大,所以我不能手动完成。我试过了mutate,但它没有按我的意愿工作。

data%>%
  mutate(., cluster_var[row==i_row, col==i_col] = 
  filter(row==(i_row-1) | row == (i_row+1) | row==i_row) %>% 
  filter(col==(i_col-1) | col==(i_col+1) | col==i_col) %>% 
  summarise(var(x)))
Error: unexpected '=' in "data%>%
  mutate(., cluster_var[row==i_row, col==i_col] ="

目前,我很茫然,不胜感激!编辑:关于我的数据的更多信息:我感兴趣的九个条目不是连续的。当目标网格具有row= 2col= 2时,我感兴趣的值是:[2,1], [2,3], [1,1], [2,1], [3,1], [1,3], [2,3], [3,3]。在示例数据中,它们是连续的行,但在我的实际数据中,我有 64 行和 64 列,row前 64 行中的值为 1,而col从 增加1:64,然后row=2col 再次1:64等等,对于总共 4096 行。所以我要总结的结果的行号与rowor中的值无关col

标签: rtidyverse

解决方案


根据我的理解,您想要计算包括目标单元格值在内的九个值的方差。该解决方案可以使用数据帧的索引值和唯一键来获取目标单元格。下面是使用 for 循环和 dplyr 的解决方案:

df= tibble(row=c(1,1,1, 2,2,2, 3,3,3), col=c(1,2,3, 1,2,3, 1,2,3), x=c(0.5, 0.5, 0.5, 0.4, 0.4, 0.4, 0.3, 0.3, 0.3), cluster_var=0)
l<-c() # empty vector which will be used for stroing variance value
df$RowNumber<- row.names(df) # getting index of row
df$key<-paste0(df$row,",",df$col) # generating key

keyList<- unique(df$key) #list all unique values of key , over this loop will run

for(i in 1:length(keyList)){

  #cat("Running For:",i,'\n')
  rowIndx <- df %>% 
        filter(key==keyList[i]) %>% 
        select(RowNumber) %>%
        as.numeric()

  filterValues <-seq((rowIndx-4):(rowIndx+4)) # getting index for 9 values including target cell

 l[i]<- df %>% 
    filter(RowNumber %in% filterValues) %>% 
     summarise(.,cluster_var =  var(x))

}

df$cluster_var<- unlist(l) # adding calculated variance to data frame

此解决方案可能不是最佳解决方案。


推荐阅读