r - 使用 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=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
and的所有可能值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 列,row
前 64 行中的值为 1,而col
从 增加1:64
,然后row=2
col 再次1:64
等等,对于总共 4096 行。所以我要总结的结果的行号与row
or中的值无关col
解决方案
根据我的理解,您想要计算包括目标单元格值在内的九个值的方差。该解决方案可以使用数据帧的索引值和唯一键来获取目标单元格。下面是使用 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
此解决方案可能不是最佳解决方案。
推荐阅读
- python - 视频未显示在 tkinter 窗口上
- ruby-on-rails - after_update 在更新 rails 之前触发事件
- python - 为什么在 pandas DataFrame 中更改 `__repr__` 不会改变其显示?
- oracle - 带聚合函数的 Oracle 动态 SQL 过程通过 ORDS 调用需要很长时间,但在 SQL Developer 中运行速度很快
- python - Pyinstaller 无法访问数据文件夹
- spring-boot - ignore_row_on_dupkey_index 不适用于 Spring Boot
- apache-flink - JSON 到 Avro 解码 - AvroTypeException:未找到预期的字段名称
- python - 如何修改字典中的值?
- wordpress - 如果帖子类型名称为“媒体”,则 WordPress 古腾堡编辑器不适用于自定义帖子类型
- google-apps-script - 显示包含来自另一个单元格的值的消息的自定义函数 Google 表格