循环和在R中创建新变量

mzsu5hc0  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(156)

我有一个包含多个年份和变量的数据集。我会指定每个年份和变量的数量,但我正在尝试创建一个脚本,该脚本可以运行,而不必为每个年份/变量复制和粘贴每个块,因此希望代码可以工作,而不考虑这些规范。基本上,对于每个变量,我都有一个膨胀的对应项。比如INCOME和INCOME_INFLATED,我想创建一个手动膨胀版本的INCOME(INCOME_MANUAL),并将其与INCOME_INFLATED进行比较。
下面是我输入数据的一个例子:
| 年份|收入|收入膨胀|CPIU|
| - ------| - ------| - ------| - ------|
| 二○ ○ ○年|一千五百|三千人|第二章|
| 二○ ○一年|一千|一千五百|1.5岁|
| 二○ ○二年|二○ ○ ○年|六千|三个|
下面是我希望输出数据的外观:
| 年份|收入|收入膨胀|CPIU|收入_手册|
| - ------| - ------| - ------| - ------| - ------|
| 二○ ○ ○年|一千五百|三千人|第二章|三千人|
| 二○ ○一年|一千|一千五百|1.5岁|一千五百|
| 二○ ○二年|二○ ○ ○年|六千|三个|六千|
其中income_manual是收入x CPIU。CPIU是一个数字变量,每年都有一个唯一的值。对于一两个变量来说,这很容易,但我很难弄清楚如何在不复制和粘贴每个变量的代码的情况下,为40多个变量实现这一点。
我可以很容易地创建一个相关变量的列表,我只是不知道如何创建一个循环,允许命名和创建新变量,所以用户可以只输入他们的数据文件并运行它。
这段代码成功地创建了按年份筛选的名为"data_[YEAR]"的新数据文件。(年份是变量YEAR中唯一值的列表。)

for (y in years[]) {
  dy <- data %>% filter(YEAR == y)
  assign(paste0("data_", y), dy)
}
remove(dy)

但是,当我试图将同样的逻辑应用于变量时,它就不起作用了(vars是相关变量的列表)。

for (v in vars[]) {
  data <- data %>% mutate(x = v * CPIU)
  assign(paste0(v, "_manual"), data$x)
}

它给出了以下错误:

Error in `mutate()`:
! Problem while computing `x = v * CPIU`.
Caused by error in `v * CPIU`:
! non-numeric argument to binary operator

我相当习惯于在bash脚本中执行这些"创建新对象"的操作,但在R中却没有这么多,所以我不确定如何调用这种"字典"。本质上,我如何才能让R将"v"理解为实际的变量,而不是将变量名理解为字符串?

    • 实际上,我希望执行以下操作:**
data$income_manual <- data$income * data$CPIU
    • 用于许多变量,而不必反复复制和粘贴此行。**

让我知道如果需要更多的细节或背景!非常感谢。

  • 我也知道这里有很多问题和这个问题相似,但我不知道如何将它应用到我自己的工作中,我对R还是一个新手,所以我很抱歉有点困惑。*
hrysbysz

hrysbysz1#

IIUC -您可以使用矩阵运算从变量块中分配 Dataframe 的新列:

relevant_vars <- c("income", ...)

data[paste0(relevant_vars, "_manual")] <- data[relevant_vars] * data$CPIU

要使用mtcars进行演示:

relevant_vars <- names(mtcars)
mtcars$CPIU <- runif(nrow(mtcars))
  
mtcars[paste0(relevant_vars, "_manual")] <- mtcars[relevant_vars] * mtcars$CPIU

str(mtcars)
'data.frame':   32 obs. of  24 variables:
 $ mpg        : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl        : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp       : num  160 160 108 258 360 ...
 $ hp         : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat       : num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt         : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec       : num  16.5 17 18.6 19.4 17 ...
 $ vs         : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am         : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear       : num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb       : num  4 4 1 1 2 1 4 2 2 4 ...
 $ CPIU       : num  0.699 0.616 0.111 0.658 0.957 ...
 $ mpg_manual : num  14.68 12.93 2.54 14.09 17.9 ...
 $ cyl_manual : num  4.194 3.695 0.446 3.95 7.658 ...
 $ disp_manual: num  111.8 98.5 12 169.9 344.6 ...
 $ hp_manual  : num  76.9 67.7 10.4 72.4 167.5 ...
 $ drat_manual: num  2.726 2.402 0.429 2.028 3.015 ...
 $ wt_manual  : num  1.831 1.771 0.259 2.117 3.293 ...
 $ qsec_manual: num  11.51 10.48 2.07 12.8 16.29 ...
 $ vs_manual  : num  0 0 0.111 0.658 0 ...
 $ am_manual  : num  0.699 0.616 0.111 0 0 ...
 $ gear_manual: num  2.796 2.464 0.446 1.975 2.872 ...
 $ carb_manual: num  2.796 2.464 0.111 0.658 1.915 ...

相关问题