在筛选了我想要汇总的子集的所有数据后,我正在字符串中将汇总统计的结果添加到同一个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=2
和col=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
当然,我需要循环遍历row
和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= 2
和col= 2
时,我感兴趣的值是:[2,1], [2,3], [1,1], [2,1], [3,1], [1,3], [2,3], [3,3]
。在示例性数据中,它们是连续的行,但在我的实际数据中,我有64行64列,前64行中row
的值为1,而col
从1:64
增加,然后row=2
和col再次为1:64
,依此类推,总共4096行。因此,我要汇总的结果的行号与row
或col
中的值没有关联
根据我的理解,您需要计算包括目标单元格值在内的九个值的方差。该解决方案可以使用数据帧的索引值和唯一密钥来获取目标单元格。以下是使用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,你把我带向了正确的方向。也许这有助于人们在未来寻找这个或类似的东西。