当前位置: 首页 > 知识库问答 >
问题:

需要在R中使用cross()同时创建多个新变量

吕向荣
2023-03-14

我有数据集,我需要调整通货膨胀的多个变量。它看起来像这样。

我需要把这些都放在一个恒定的格式中(比如2020美元)。我可以用< code>priceR包中的< code > adjust _ for _ inflation 函数很容易地做到这一点。然而,有很多价格变量,所以我想自动创建它们。我一直在尝试使用< code > cross ,但它不起作用。以下是我一直在尝试的。

library(tidyverse)
library(priceR)

#this is it done manually, which would take hours

df %>%  mutate(adjusted_price1=adjust_for_inflation(price1,year,"US",to_date = 2020))

#here's my attempt to do it all at once
price.vars <- df %>% select(-year) %>% names()

dollars2020 <- function(x){
  
  y <- adjust_for_inflation(x,year,"US",to_date = 2020)
}

df <- df %>% 
  mutate(across(price.vars, dollars2020,.names ="adjusted_{col}"))

据我所知,这应该是一个新变量的列表,名称为<code>adjusted_price1</code>等等。但它不起作用。我非常感谢任何人能给我的帮助。

共有3个答案

公羊玉泽
2023-03-14

只是命名部分不好用吗?如果是这样,那就把{col}改成{. col}

端木弘方
2023-03-14

也许这对你有用。我没有使用自定义函数,而是将<code>adjust_for_inflation

密码

library(dplyr)
library(priceR)

price.vars <- df  %>% select(-year) %>% names()

df %>% mutate(across(price.vars, ~ adjust_for_inflation(.x, year, "US", to_date = 2020), .names = "adjusted_{col}"))

输出

# A tibble: 3 x 9
   year price1 price2 price3 price4 adjusted_price1 adjusted_price2 adjusted_price3 adjusted_price4
  <int>  <dbl>  <dbl>  <dbl>  <dbl>           <dbl>           <dbl>           <dbl>           <dbl>
1  2003   1.15   1.15   1.16   1.17            1.62            1.62            1.64            1.65
2  2004   1.17   1.16   1.18   1.18            1.60            1.59            1.62            1.62
3  2005   1.17   1.17   1.18   1.18            1.55            1.55            1.57            1.56

数据

df <- tibble(fread("year    price1  price2  price3  price4
2003    1.149   1.149   1.163   1.172
2004    1.169   1.164   1.184   1.18
2005    1.167   1.166   1.183   1.178"))
农鸿达
2023-03-14

问题不在于您在中使用,而是您的函数。首先,您将一个名为年份的变量传递给不存在的adjust_for_inflation。其次,您的函数不返回任何东西。如果您将其更改为:

dollars2020 <- function(x){
  
  adjust_for_inflation(x, 2022,"US",to_date = 2020)
}

您将获得:

df %>% 
  mutate(across(price.vars, dollars2020,.names ="adjusted_{col}"))
#>   year price1 price2 price3 price4 adjusted_price1 adjusted_price2 adjusted_price3 adjusted_price4
#> 1 2003  1.149  1.149  1.163  1.172        1.134999        1.134999        1.148828        1.157719
#> 2 2004  1.169  1.164  1.184  1.180        1.154755        1.149816        1.169572        1.165621
#> 3 2005  1.167  1.166  1.183  1.178        1.152779        1.151792        1.168585        1.163645

 类似资料:
  • 我需要帮助完成一项看似简单的任务。我想基于< code>dplyr::mutate中的一个条件创建几个新变量。我可以使用< code>ifelse创建一个新变量,但是我想一步创建几个。 让我们假设这是我的数据帧。 我想要这样的东西: 因此,if条件应该基于条件< code>y创建三个新变量 我想与< code>if_else和< code>case_when一起使用。 谢谢转发

  • 问题内容: 所以,我不确定那是什么。如果在 ModuleA中 ,我有: 在 ModuleB中 ,我有: 在主程序中,我有: 因此,当我运行主程序时,我想我将创建两个猫鼬“实例”;一个连接到pathA,一个连接到pathB,对吗? 另外,在模块B中,在我连接到pathB之前,它是连接到pathA还是什么都没有? 谢谢。 问题答案: 我刚刚对最新的节点V0.4.6做了一些测试。我确认了以下内容: 从“

  • 我有一个命名的数据帧列表。我需要用数据帧的名称为每个数据帧创建一个新变量,这样我最终就可以将它们全部rbind起来,以生成统计数据和绘图。 我知道lapply不会传递对象的名称,也知道有很多类似问题的帖子,但我无法将我看到的任何解决方案适用于我的特定问题。 这是我第一次尝试的方法,但显然不起作用,因为names(x)不会返回对象的名称。 TestList<-list(a=data.frame(Va

  • 考虑这个简单的例子: 在这里,我想将函数应用于包含的所有列,但我希望这些新列称为对应列的。 我知道我能做到 但我需要的是这个 有没有一种解决方案不需要存储中间数据,并合并回原始数据帧?

  • 是否可以在同一事务中使用Cloud FiRecovery针对集合创建多个文档? 我正在查看批处理写入的留档。除非我弄错了(我是Firebase的新手,可能是这样),这些示例旨在演示“批处理写入”,但示例仅显示正在更新的单个字段。

  • 问题内容: 所以我的任务听起来很简单,但是却使我感到困惑。我已经浏览了Internet上的代码,但无法掌握。我也无法掌握老师张贴的幻灯片。这是我的要求。 创建一个新的运行时异常类型,称为EmptyStackException。 但是,我不知道如何制作方法,类,变量或满足要求所需的任何内容。我有一些类是DynamicArrayStack和LinkedStack的实现。堆栈的接口。 任何指针将大有帮助