矩阵同步转换与汇总:按年份拆分表格并合并坐标对应类型计数的实现问询
矩阵同步转换与汇总:按年份拆分表格并合并坐标对应类型计数的实现问询
看起来你想要的是把每个年份下同一坐标点的不同类型计数合并成类似1X2Y这样的紧凑字符串格式,而不是分开展示X/Y/Z的计数列对吧?我来帮你梳理两种实现方式:一种是从原始数据直接生成目标格式,另一种是把你已经生成的分类型计数表格转换过去。
方法一:从原始数据直接生成目标格式
假设你用的是R语言(从Matrices_by_year的命名风格来看应该是),我们可以用dplyr包来快速处理:
1. 先构造你的原始数据(如果还没结构化的话)
# 把你给出的原始数据转换成数据框 df <- data.frame( Type = c("X", "Y", "Y", "Z", "Y"), Year = c(2016, 2017, 2022, 2017, 2018), Latitude = c(50.079, 50.079, 50.079, 50.079, 50.079), Longitude = c(14.425, 14.425, 14.425, 14.425, 14.425) )
2. 分组统计并拼接类型计数
library(dplyr) # 核心处理逻辑:按年份、坐标分组,统计每个类型的数量,再拼接成字符串 processed_df <- df %>% # 按年份、纬度、经度分组 group_by(Year, Latitude, Longitude) %>% # 统计每个分组内各类型的数量 count(Type) %>% # 把"数量+类型"拼接成单个字符串(比如1个X就变成"1X") mutate(type_count_str = paste0(n, Type)) %>% # 把同一个坐标下的所有类型计数字符串合并成一个 summarise(combined_types = paste(type_count_str, collapse = "")) %>% # 取消分组 ungroup() # 按年份拆分,得到每个年份独立的表格 Matrices_by_year_formatted <- split(processed_df, processed_df$Year)
比如查看2017年的结果:
Matrices_by_year_formatted$`2017`
会得到:
# A tibble: 1 × 4 Year Latitude Longitude combined_types <dbl> <dbl> <dbl> <chr> 1 2017 50.1 14.4 1Y1Z
3. 可选:转换为行是纬度、列是经度的宽表
如果想要更贴近你示例里的行列布局(纬度为行,经度为列),可以再用tidyr::pivot_wider转换:
library(tidyr) wide_processed <- processed_df %>% group_by(Year) %>% pivot_wider(names_from = Longitude, values_from = combined_types) %>% ungroup() # 再按年份拆分 Matrices_by_year_wide <- split(wide_processed, wide_processed$Year)
方法二:从你已生成的分类型计数表格转换
如果你已经有了类似Matrices_by_year$2018这种X/Y/Z分列为计数的表格,可以直接把每行的非零计数和类型拼接:
转换函数示例
convert_count_table <- function(year_df) { year_df %>% rowwise() %>% # 遍历X/Y/Z列,只保留计数>0的,拼接成"数量+类型"的字符串 mutate(combined_types = paste0( ifelse(X > 0, paste0(X, "X"), ""), ifelse(Y > 0, paste0(Y, "Y"), ""), ifelse(Z > 0, paste0(Z, "Z"), "") )) %>% ungroup() %>% # 只保留坐标和合并后的字符串列 select(Latitude, Longitude, combined_types) } # 应用到所有年份的表格 Matrices_by_year_formatted <- lapply(Matrices_by_year, convert_count_table)
这样就能把你现有的每个年份的计数表格,转换成你想要的紧凑格式了。
备注:内容来源于stack exchange,提问作者Cihla Face
相关产品推荐
相关产品推荐

