英文:
How to Subtract Values Within Two Lists
问题
以下是你要的代码翻译部分:
# 创建一个用于存储坐标差异的列表
coord.diff <- list()
# 循环遍历数据框的每个元素
for(i in 1:length(df)){
coord.diff[[i]] <- (list2[[i]] - list1[[i]])
}
这段代码会计算两个列表中相应元素之间的差异,并将结果存储在coord.diff
列表中。如果你有任何其他问题,或需要进一步的帮助,请告诉我。
英文:
I have two lists of animal tracking data. Each list contains the animal ID and a list of utm coordinates. My lists look something like this:
list1
list1 | List[2] | List of length 2 |
---|---|---|
TM1 | integer[3] | 300,350,200 |
TM2 | integer[2] | 175,150 |
list2
list2 | List[2] | List of length 2 |
---|---|---|
TM1 | double[3] | 315,345,205 |
TM2 | double[2] | 170,165 |
What I would like to do is subtract the coordinates for each individual to get a final list that looks something like this:
X | List[2] | List of length 2 |
---|---|---|
TM1 | integer[3] | 15,-5,5 |
TM2 | integer[2] | -5,15 |
I tried setting up a for loop to subtract the values (just a note, df here is a placeholder for the original dataframe of length 2):
'''r
coord.diff<-list()
for(i in 1:length(df)){
coord.diff[i]<-(list2[[i]]-list1[[i]])
}
'''r
which returns the following errors:
'''r
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
'''r
Oddly enough however, when I do the following I actually get the list of differences that I want:
'''r
list2[[1]]-list1[[1]]
'''r
but I would like to be able to automate the process through a loop.
答案1
得分: 0
在tidyverse
中的一个快速解决方案是使用purrr
包,更具体地说是purrr::map2
函数,该函数适用于两个输入:
# 设置虚拟数据
list1 <- list(TM1 = c(300, 350, 200),
TM2 = c(175, 150))
list2 <- list(TM1 = c(315, 345, 205),
TM2 = c(170, 165))
# 应用map2函数定义列表输入并执行操作(y = list2,x = list1)
purrr::map2(list1, list2, ~.y - .x)
$TM1
[1] 15 -5 5
$TM2
[1] -5 15
为了更好地理解,如果要应用的数学操作更复杂,即您可以单独定义要应用的函数并通过purrr::map2
调用应用它:
myfun <- function(x, y){
ret <- y - x
return(ret)
}
purrr::map2(list1, list2, ~ myfun(.x, .y))
$TM1
[1] 15 -5 5
$TM2
[1] -5 15
基本的R选项看起来像这样,使用mapply
:
mapply(function(x ,y) {
ret <- y - x
return(ret)
},
x = list1, y = list2)
$TM1
[1] 15 -5 5
$TM2
[1] -5 15
正如@onyambu在评论中指出的那样,这是简洁的基本R方法:
Map(`-`, list1, list2)
$TM1
[1] -15 5 -5
$TM2
[1] 5 -15
这种简化也可以与purrr::map2()
调用一起使用,正如@onyambu在评论中也指出的那样:
purrr::map2(list2, list1, `-`)
$TM1
[1] 15 -5 5
$TM2
[1] -5 15
英文:
One fast solution within the tidyverse
is to use the purrr
package, more specifically the purrr::map2
function, which works on two inputs:
# set up dummy data
list1 <- list(TM1 = c(300, 350, 200),
TM2 = c(175,150))
list2 <- list(TM1 = c(315, 345, 205),
TM2 = c(170,165))
# apply map2 function defining list inputs and performin the operation
# (y = list2, x = list1)
purrr::map2(list1, list2, ~.y - .x)
$TM1
[1] 15 -5 5
$TM2
[1] -5 15
For better comprehention, if the mathematical operation to apply has more complexity i.e., you can define the function to apply seperately and apply it via the purrr::map2
call:
myfun <- function(x, y){
ret <- y - x
return(ret)
}
purrr::map2(list1, list2, ~ myfun(.x, .y))
$TM1
[1] 15 -5 5
$TM2
[1] -5 15
The base R option would look something like this, using mapply
:
mapply(function(x ,y) {
ret <- y - x
return(ret)
},
x = list1, y = list2)
$TM1
[1] 15 -5 5
$TM2
[1] -5 15
as @onyambu pointed out in the comment this is consice base are approach:
Map(`-`, list1, list2)
$TM1
[1] -15 5 -5
$TM2
[1] 5 -15
This simplification can also be used with the purrr::map2()
call as @onyambu pointed out also in the comments:
purrr::map2(list2, list1, `-`)
$TM1
[1] 15 -5 5
$TM2
[1] -5 15
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论