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

2023-12-21

该数据框包含我所说的“数据”:

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()

这给出了相同的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将具有多变量函数的列表变量的数据框应用到具有函数参数的数据框 的相关文章

  • 将所有 0 值替换为 NA

    我有一个包含一些数字列的数据框 某些行具有 0 值 在统计分析中应将其视为空 在R中将所有0值替换为NULL的最快方法是什么 将所有零替换为 NA df df 0 lt NA 解释 1 它不是NULL你应该用什么来替换零 正如它所说 NUL
  • 如何将 r 数据框转换为 h2o 对象

    我对 R 和 H2O 很陌生 我试图找到一种将 r 数据帧转换为 h2o 对象的方法 我花了一些时间研究如何做到这一点 但没有运气 其他方式也是可能的 并且有详细记录如下 prosPath system file extdata prost
  • R 中的“右”滚动平均值和“左”滚动平均值是什么?

    如果我想计算之前的n意味着年份滞后于当年 我将如何实现这一点 它像 右 滚动平均窗口一样简单吗 或者它是一个 左 滚动平均窗口 我不确定这里使用哪个窗口 样本数据 set seed 1234 dat lt data frame year c
  • 根据一个或多个下拉选项创建具有不同类型线型的折线图

    在下面闪亮的应用程序中 我尝试根据侧边栏中的下拉选择创建点线图 我已成功在选择一个指标时创建折线图 但无法选择 2 个指标 为了x and y我想要一个solid线 对于x1 and y1我想要一个dashed线和对于x2 and y2一条
  • 安装 R 包。包含目录为空。开发标头

    我目前正在尝试运行一些最初在 2 11 0 下运行的 R 代码 我使用的 R 版本 2 14 1 无法运行该代码 我不熟悉 R 及其向后兼容性 据我所知 我的问题可能与版本无关 我会很高兴得知这是我做错的事情 其余的代码是无关紧要的 即使我
  • 在 R 中使用 apply() 时出现未使用参数错误

    当我尝试对日期列使用 apply 条件以返回一组系数时 收到错误消息 我有一个数据集 为简单起见 此处进行了修改 但可重现 ADataset lt data table Epoch c 2007 11 15 2007 11 16 2007
  • 如何扩展 ggplot y 轴限制以包含最大值

    通常 在图中 Y 轴值标签会在绘制的最大值下方被截断 For example library tidyverse mtcars gt ggplot aes x mpg y hp geom point 我知道scale y continous
  • data.table 相当于 dplyr::filter_at

    考虑数据 library data table library magrittr vec1 lt c Iron Copper vec2 lt c Defective Passed Error set seed 123 a1 lt sampl
  • 对 data.table 进行子集化的最快方法是什么?

    在我看来 这是执行行 列子集的最快方法data table是使用 join 和nomatch option 它是否正确 DT data table rep 1 100 100000 rep 1 10 1000000 setkey DT V1
  • 将 SAS sas7bdat 数据读入 R

    R 有哪些选项可以读取本机 SAS 格式的文件 sas7bdat 进入R The NCES 共同核心 https nces ed gov ccd pubschuniv asp例如 包含以此格式保存的大量数据文件存储库 为了具体起见 让我们集
  • 在两个向量之间交换元素(交叉)

    假设我有 chromosome 1 lt c 0010000001010000 chromosome 2 lt c 0100000001001010 我该如何实施step 3 5 Evaluate NC1 否 中 1 个chromosome
  • ggplot2 geom_function 可以跨 arg 值进行分面吗?

    我想通过分面 geom function 创建 ggplot2 图 以便函数的参数在网格中变化 例如像这样的东西 my function lt function x par if par 1 return sin x else return
  • 数据框中按行相关

    我正在尝试计算大型数据帧的所有行之间的相关性 到目前为止已经提出了一个有效的简单 for 循环 例如 name lt c a b c d col1 lt c 43 78 43 84 37 92 31 72 col2 lt c 43 80 4
  • OpenStreetMap 不显示在 RStudio 中(使用 R 3.2.1)

    我正在使用来自的代码here https rstudio github io leaflet library leaflet m lt leaflet gt addTiles gt addMarkers lng 174 768 lat 36
  • ggplot2 中的颜色和填充参数有什么区别?

    ggmap location geom density 2d aes long lat df geom point aes long lat color special alpha 0 5 data df 当我更改填充颜色时 我看不出有什么
  • 如何在 R 中创建纯 ascii 表作为输出,类似于 MySQL 风格?

    我正在尝试为 R 找到一个输出的函数data frameMySQL 风格的 ascii 表中的对象如下 id var1 var2 1 asdf g 2 asdf h 3 asdf j 有这样的功能吗 至少有两个工具可以做到这一点 csvfi
  • 如何在复杂的皂膜GAM中设置更平滑的边界条件?

    我正在对南太平洋岛屿泻湖中宽吻海豚的分布进行建模 我想使用肥皂膜平滑器来模拟海豚在二维表面 经度 x 纬度 上存在的概率 考虑到陆地边界 显然海豚不能在陆地上行走 我想知道如何将我的研究区域 陆地和近海水域 的边界固定为等于零的条件 因为我
  • 当我添加形状时,分组哑铃图变得不稳定

    我有以下数据显示白人与黑人在各个领域的一致性百分比 我想创建一个分组哑铃图 其中国家值和州值彼此相邻 以便于比较 Domain c A B C D E F G A B C D E F G A B C D E F G A B C D E F
  • 二部图匹配以匹配两个集合

    我是新手igraphR 中的包 我有两套A and B 每个都有N顶点 A1 A2 AN and B1 B2 BN 每个元素之间都有一个边缘A对每一个元素B 我有一个函数fWgt Ai Bj 返回之间的边的权重Ai and Bj 我一直在尝
  • 如何在 R 中创建“堆叠瀑布”图表?

    I was able to find several packages to create a waterfall chart in R which look like this But I could not find a way to

随机推荐