r-使用tidyverse同时过滤、汇总结果,并将结果放在同一数据帧的指定位置的新列中



在筛选了我想要汇总的子集的所有数据后,我正在字符串中将汇总统计的结果添加到同一个tibble的另一列中指定位置的tibble中。它包含网格单元景观中空间显式模拟的结果。我有一列指定了横向的列和行,还有一列用于结果。我想做的是取目标网格单元,例如row= 2, col =2,并计算目标单元及其周围八个单元的方差。这样做的结果应该存储在数据帧的新列中,即目标网格单元格的行中。过滤数据以只选择我感兴趣的九个补丁可以正常工作,但将结果存储在特定位置的新列中是不起作用的。我需要一个通用的解决方案,因为我想循环遍历所有网格单元(由行和列给出(,还需要循环遍历几个tibble,这些tibble包含相似的数据,但适用于不同的风景我在这里放了示例代码,我的真实数据集要大得多。

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中,其中有row=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

当然,我需要循环遍历rowcol的所有可能值,以填充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列,前64行中row的值为1,而col1:64增加,然后row=2和col再次为1:64,依此类推,总共4096行。因此,我要汇总的结果的行号与rowcol中的值没有关联

根据我的理解,您需要计算包括目标单元格值在内的九个值的方差。该解决方案可以使用数据帧的索引值和唯一密钥来获取目标单元格。以下是使用for loop和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

这种解决方案可能不是最佳方案。

我在这里找到了一个适用于大多数目的的解决方案。它不仅仅是在小事上,而且起到了作用。以下代码可以,我想要什么:

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=numeric(nrow(data))
for(i in 1:max(data$row)){
for(j in 1:max(data$col)){
i_row=i
i_col=j
position=which(data$row==i_row & data$col==i_col)
cluster_var_temp= as.numeric(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)))
cluster_var[position]=cluster_var_temp
}
} 
data=cbind(data, cluster_var)
> data
row col   x cluster_var
1   1   1 0.5 0.003333333
2   1   2 0.5 0.003000000
3   1   3 0.5 0.003333333
4   2   1 0.4 0.008000000
5   2   2 0.4 0.007500000
6   2   3 0.4 0.008000000
7   3   1 0.3 0.003333333
8   3   2 0.3 0.003000000
9   3   3 0.3 0.003333333

感谢大家的帮助@Nirbhai Singh,你把我带向了正确的方向。也许这有助于人们在未来寻找这个或类似的东西。

最新更新