gpt4 book ai didi

r - 将具有多变量函数列表变量的数据框应用于具有函数参数的数据框

转载 作者:行者123 更新时间:2023-12-05 00:48:38 25 4
gpt4 key购买 nike

这个数据框包含我称之为“数据”的东西:

library(tidyverse)
df_d <- data_frame(key = c("cat", "cat", "dog", "dog"),
value_1 = c(1,2,3,4),
value_2 = c(2,4,6,8))

这是我打算用作函数查找表之类的数据框。 f是单变量函数和 f2是一个多变量函数:
df_f <- data_frame(key = c("cat", "dog"),
f = c(function(x) x^2, function(x) sqrt(x)),
f2 = c(function(x) (x[1]+x[2])^2, function(x) sqrt(x[1]+x[2])))

我可以轻松制作一个数据框,以便任何 cat行获取 cat函数和任何 dog行获取 dog职能:
df_both <- left_join(df_d, df_f)

我能够弄清楚如何应用每个 f功能,比如说, value_1列获取:
df_both %>% mutate(result = invoke_map_dbl(f, value_1))        
#> # A tibble: 4 x 6
#> key value_1 value_2 f f2 result
#> <chr> <dbl> <dbl> <list> <list> <dbl>
#> 1 cat 1.00 2.00 <fn> <fn> 1.00
#> 2 cat 2.00 4.00 <fn> <fn> 4.00
#> 3 dog 3.00 6.00 <fn> <fn> 1.73
#> 4 dog 4.00 8.00 <fn> <fn> 2.00

我的问题是:如何创建列 result2接受 f2 中的每个函数并用作其输入 c(value_1, value_2) .如果重新定义 f2 中的函数成为两个变量的显式函数会使事情变得容易得多,这也很好。

期望的输出:
#> # A tibble: 4 x 7
#> key value_1 value_2 f f2 result result2
#> <chr> <dbl> <dbl> <list> <list> <dbl> <dbl>
#> 1 cat 1.00 2.00 <fn> <fn> 1.00 9.00
#> 2 cat 2.00 4.00 <fn> <fn> 4.00 36.0
#> 3 dog 3.00 6.00 <fn> <fn> 1.73 3.00
#> 4 dog 4.00 8.00 <fn> <fn> 2.00 3.46

(这个问题是由今天早些时候的一个不幸的自删除问题引发的。)

最佳答案

“如果将 f2 中的函数重新定义为两个变量的显式函数会使事情变得容易得多,那也很好。”

是的,我认为这将是一种更自然的情况。否则数据将按行存储,并且可能应该重新整形。

重新定义你的功能:

df_f <- data_frame(key = c("cat", "dog"),
f = c(function(x) x^2, function(x) sqrt(x)),
f2 = c(function(x, y) (x + y)^2, function(x, y) sqrt(x + y)))
df_both <- left_join(df_d, df_f)

现在您再次使用 map_invoke , 路过 .x作为列表,尽管您需要使用 transpose 将列表翻转过来:
mutate(
df_both,
result = invoke_map_dbl(f, value_1),
result2 = invoke_map_dbl(f2, transpose(list(value_1, value_2)))
)

# A tibble: 4 x 7
key value_1 value_2 f f2 result result2
<chr> <dbl> <dbl> <list> <list> <dbl> <dbl>
1 cat 1. 2. <fn> <fn> 1.00 9.00
2 cat 2. 4. <fn> <fn> 4.00 36.0
3 dog 3. 6. <fn> <fn> 1.73 3.00
4 dog 4. 8. <fn> <fn> 2.00 3.46


一组三个参数函数将简单地扩展到 invoke_map_dbl(f3, transpose(list(value_1, value_2, value_3))
请注意,这种方法不适用于大型数据集,因为您没有使用矢量化。

一个更具可扩展性的替代方案可能涉及嵌套,您至少在每个组中应用每个函数一次:
df_both %>% 
group_by(key) %>%
nest() %>%
mutate(data = map(
data,
~mutate(., result = first(f)(value_1), result2 = first(f2)(value_1, value_2))
)) %>%
unnest()

这给出了相同的结果。

关于r - 将具有多变量函数列表变量的数据框应用于具有函数参数的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49266076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com