【发布时间】:2016-02-16 19:05:49
【问题描述】:
我试图找到一个干净、高效的方法来创建一个对 5 个现有变量进行复杂计算的新变量。我的问题是,一个变量是一个因素,而其他 4 个包含 NA。
我有一个包含多组变量的数据集,结构如下:
- expenditure_period - 1 = 每天,2 = 每周,3 = 的因子 每月,4 = 每年
- expenditure1 - 整数,每天花费的金额
- expenditure2 - 整数,每周花费的金额
- expenditure3 - 整数,每月花费的金额
- expenditure4 - 整数,一年中花费的金额
对于每一行/观察,4 个整数字段中只有一个具有数值,具体取决于支出周期的值,其余为 NA。
例如:
expenditure_period expenditure1 expenditure2 expenditure3 expenditure4
1 monthly NA NA 5 NA
2 weekly NA 5 NA NA
3 monthly NA NA 2 NA
4 monthly NA NA 5 NA
5 monthly NA NA 58 NA
我想创建一个包含标准每月支出的新变量。因此,如果支出周期为每日,则支出 1*30。如果是每周,则支出 2 * 4。如果是每月,则支出 3 * 1。如果每年,则支出 4 / 12。
我能想到的最佳解决方案是以下混乱:
data$expenditure_factor[data$expenditure_period=="daily"] <- 30
data$expenditure_factor[data$expenditure_period=="weekly"] <- 4
data$expenditure_factor[data$expenditure_period=="monthly"] <- 1
data$expenditure_factor[data$expenditure_period=="yearly"] <- 1/12
data$expenditure_month <- apply(data[,c("expenditure1", "expenditure2",
"expenditure3", "expenditure4", "expenditure_factor")], 1,
function(x) { sum(x[1:4], na.rm=TRUE) * x[5]} )
我尝试使用 + 运算符将支出 1、2、3、4 相加,但是由于将 1 个数字添加到 3 个 NA,这导致所有 NA。我尝试使用带有 rm.na 的 sum 函数创建一个临时变量,但这导致每一行的总和相同。我尝试使用 dplyr 包中的 mutate ,但没有效果。
有没有更简单、更优雅的方法来做到这一点?我必须对大约 12 种不同的支出类别进行相同的处理。如果以前有人问过这个问题,我很抱歉,我找不到类似的线程。如果已经有请指导我。
我在 Windows 7 上使用 RStudio 和 R 3.2.3。
【问题讨论】:
-
如果您的示例易于重现并且您也显示了您想要/预期的结果,那就更好了。以下是一些指导:stackoverflow.com/a/28481250/1191259
-
将
apply语句与switch一起使用