在R中dplyr管道的变异中如何使用hashmap的查询功能?

sdnqo3pr  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(130)

我想用散列Map找到一个值,然后用这个值来计算一个新值。通常我努力高效地工作,但我不是很精通R。我知道DPLYR管道的基础知识,所以不想再用for循环了。
下面是一个可以重现的最小例子:

data("mtcars")

m.subset <- mtcars[2:7, 10:11]
letters <- c("a", "b", "c", "d", "e", "f")
m.subset <- cbind(m.subset, letters)

testmap <- hashmap()
testmap[c("a", "b", "c", "d", "e", "f")] <- c(4.0, 5.0, 6.0, 7.0, 8.0, 9.0)

m.subset %>% mutate(score1=query(testmap, letters)*gear) -> m.subset

不幸的是,我得到这个错误:

Error in `mutate()`:
! Problem while computing `score1 = query(testmap, letters) * gear`.
✖ `score1` must be size 6 or 1, not 0.
Run `rlang::last_error()` to see where the error occurred.

需要注意的是,这是可行的:score1=query(testmap, m.subset$letters[1])*m.subset$gear[1],这里我显然可以用i替换1,并使用for循环,但我宁愿不这样做,因为dplyr管道非常适合进行列计算。
我还读了一些关于StackOverflow的问题,比如error-in-r-mutate-must-be-size-4-or-1-not-0

klsxnrf1

klsxnrf11#

假设你使用r2r来表示hashmapquery,你可以尝试以下方法:使用purrr中的map2,你可以遍历lettersgear中的每个元素,然后使用你的testmap来应用函数query

library(tidyverse)
library(r2r)

m.subset %>% 
  mutate(score1 = map2(
    letters,
    gear,
    ~ query(testmap, .x) * .y
  ))
    • 产出**
gear carb letters score1
Mazda RX4 Wag        4    4       a     16
Datsun 710           4    1       b     20
Hornet 4 Drive       3    1       c     18
Hornet Sportabout    3    2       d     21
Valiant              3    1       e     24
Duster 360           3    4       f     27

相关问题