如何对两个动物追踪数据列表中的坐标值进行相减运算
R语言中按个体计算动物追踪坐标差值(解决循环赋值错误)
问题背景
我有两份动物追踪数据列表,每份包含动物ID和对应的UTM坐标序列:
list1 数据
| list1 | 数据类型 | 坐标列表 |
|---|---|---|
| TM1 | integer[3] | 300, 350, 200 |
| TM2 | integer[2] | 175, 150 |
list2 数据
| list2 | 数据类型 | 坐标列表 |
|---|---|---|
| TM1 | double[3] | 315, 345, 205 |
| TM2 | double[2] | 170, 165 |
我需要按动物个体,将list2的坐标减去list1的对应坐标,得到如下结果:
期望结果
| 动物ID | 数据类型 | 差值列表 |
|---|---|---|
| TM1 | integer[3] | 15, -5, 5 |
| TM2 | integer[2] | -5, 15 |
尝试的代码及错误
我用for循环尝试实现,但出现赋值错误:
# df为长度2的原始数据框占位符 coord.diff <- list() for(i in 1:length(df)){ coord.diff[i] <- (list2[[i]] - list1[[i]]) }
报错信息:
1: In coord.diff[i] <- (list2[[i]] - list1[[i]]) : number of items to replace is not a multiple of replacement length 2: In coord.diff[i] <- (list2[[i]] - list1[[i]]) : number of items to replace is not a multiple of replacement length
单独执行list2[[1]] - list1[[1]]能得到正确差值,但循环自动化处理时出错。
解决方案
问题出在列表赋值语法上:coord.diff[i]是列表的单个元素位置,直接赋值向量会被拆分成多个元素填充,导致长度不匹配。改用coord.diff[[i]]赋值,就能把差值向量作为列表的第i个完整元素存储。
修正后的for循环代码
coord.diff <- list() # 遍历list1/list2的长度(假设两者长度一致) for(i in 1:length(list1)){ # 计算差值 coord.diff[[i]] <- list2[[i]] - list1[[i]] # 可选:将结果转为整数类型(匹配期望结果) coord.diff[[i]] <- as.integer(coord.diff[[i]]) } # 给结果列表添加动物ID命名(假设list1已有对应命名) names(coord.diff) <- names(list1)
验证结果:
coord.diff # $TM1 # [1] 15 -5 5 # # $TM2 # [1] -5 15
更简洁的purrr包实现
如果习惯用函数式编程,可以用purrr包的map2函数避免循环:
library(purrr) # 计算差值 coord.diff <- map2(list2, list1, ~ .x - .y) # 转整数类型 coord.diff <- map(coord.diff, as.integer) # 添加命名 names(coord.diff) <- names(list1)
内容的提问来源于stack exchange,提问作者Jason Edelkind
相关产品推荐
相关产品推荐

