【问题标题】:Automation in R? Creating values from repeating values within multiple columns?R中的自动化?从多列中的重复值创建值?
【发布时间】:2021-11-19 23:35:53
【问题描述】:

我现在有非常乏味的代码,我想对其进行压缩,以提高效率并减少人为错误。现在我有一个数据集:

month <- rep(c(1:9), times = 10)
age <- rep(c(1:5), times = 18)
period <- rep(c(1:3))
value_1 <- rep(c(0.1, 0.3, 0.4, 0.7, 0.9), times = 9)
df <- data.frame(period, month, age, value_1)

我当前的代码如下所示:

period1_age1_month1<- c(ifelse(df$value_1[df$period==1 & df$month==1 & df$age==1]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==1 & df$age==1]- 1), df$value_1[df$period==1 & df$month==1 & df$age==1]+ 1)
period1_age1_month2<- c(ifelse(df$value_1[df$period==1 & df$month==2 & df$age==1]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==2 & df$age==1]- 1), df$value_1[df$period==1 & df$month==2 & df$age==1]+ 1)
period1_age1_month3<- c(ifelse(df$value_1[df$period==1 & df$month==3 & df$age==1]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==3 & df$age==1]- 1), df$value_1[df$period==1 & df$month==3 & df$age==1]+ 1)
period1_age1_month4<- c(ifelse(df$value_1[df$period==1 & df$month==4 & df$age==1]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==4 & df$age==1]- 1), df$value_1[df$period==1 & df$month==4 & df$age==1]+ 1)
period1_age1_month5<- c(ifelse(df$value_1[df$period==1 & df$month==5 & df$age==1]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==5 & df$age==1]- 1), df$value_1[df$period==1 & df$month==5 & df$age==1]+ 1)
period1_age1_month6<- c(ifelse(df$value_1[df$period==1 & df$month==6 & df$age==1]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==6 & df$age==1]- 1), df$value_1[df$period==1 & df$month==6 & df$age==1]+ 1)
period1_age1_month7<- c(ifelse(df$value_1[df$period==1 & df$month==7 & df$age==1]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==7 & df$age==1]- 1), df$value_1[df$period==1 & df$month==7 & df$age==1]+ 1)
period1_age1_month8<- c(ifelse(df$value_1[df$period==1 & df$month==8 & df$age==1]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==8 & df$age==1]- 1), df$value_1[df$period==1 & df$month==8 & df$age==1]+ 1)
period1_age1_month9<- c(ifelse(df$value_1[df$period==1 & df$month==9 & df$age==1]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==9 & df$age==1]- 1), df$value_1[df$period==1 & df$month==9 & df$age==1]+ 1)


period1_age2_month1<- c(ifelse(df$value_1[df$period==1 & df$month==1 & df$age==2]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==1 & df$age==2]- 1), df$value_1[df$period==1 & df$month==1 & df$age==2]+ 1)
period1_age2_month2<- c(ifelse(df$value_1[df$period==1 & df$month==2 & df$age==2]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==2 & df$age==2]- 1), df$value_1[df$period==1 & df$month==2 & df$age==2]+ 1)
period1_age2_month3<- c(ifelse(df$value_1[df$period==1 & df$month==3 & df$age==2]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==3 & df$age==2]- 1), df$value_1[df$period==1 & df$month==3 & df$age==2]+ 1)
period1_age2_month4<- c(ifelse(df$value_1[df$period==1 & df$month==4 & df$age==2]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==4 & df$age==2]- 1), df$value_1[df$period==1 & df$month==4 & df$age==2]+ 1)
period1_age2_month5<- c(ifelse(df$value_1[df$period==1 & df$month==5 & df$age==2]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==5 & df$age==2]- 1), df$value_1[df$period==1 & df$month==5 & df$age==2]+ 1)
period1_age2_month6<- c(ifelse(df$value_1[df$period==1 & df$month==6 & df$age==2]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==6 & df$age==2]- 1), df$value_1[df$period==1 & df$month==6 & df$age==2]+ 1)
period1_age2_month7<- c(ifelse(df$value_1[df$period==1 & df$month==7 & df$age==2]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==7 & df$age==2]- 1), df$value_1[df$period==1 & df$month==7 & df$age==2]+ 1)
period1_age2_month8<- c(ifelse(df$value_1[df$period==1 & df$month==8 & df$age==2]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==8 & df$age==2]- 1), df$value_1[df$period==1 & df$month==8 & df$age==2]+ 1)
period1_age2_month9<- c(ifelse(df$value_1[df$period==1 & df$month==9 & df$age==2]- 1 <= 0, 0, df$value_1[df$period==1 & df$month==9 & df$age==2]- 1), df$value_1[df$period==1 & df$month==9 & df$age==2]+ 1)

但是,它会针对每个年龄组进行,然后一旦代表每个年龄组,它就会在每个时期重复。每周,我都会收到一个新时期的新数据集,然后我必须返回并添加新时期(4,然后 5,然后 6),这使得代码非常长并且更新也很耗时。代码长达数百行。我现在可以更轻松地使用此代码并使其自动化而不是复制和粘贴,而是替换每个时期/年龄。

我对 R 很陌生,没有任何自动化经验。我希望有人能指出我正确的方向。循环、矢量化或应用似乎都是可行的方法。但是,我不知道如何开始。如果有人对此有任何见解,我将非常感谢任何帮助。

非常感谢!

【问题讨论】:

  • 另外请分享一个您预期结果的示例,即目前您存储了很多向量。您希望将结果作为新列附加到您的数据中吗?
  • 现在的输出存储了许多(数百个)向量,但我不希望它是这样的。我认为向数据框中添加两个新列更有意义,并且更容易使用!非常感谢你的回复!感谢您的帮助和耐心。
  • 我认为如果您分享df shared 的预期输出,您的目标会更容易理解。

标签: r loops automation vectorization apply


【解决方案1】:

不知道您对结果的最终目标是什么,您目前正尝试为每个时期/月份/年龄的组合创建一个单独的计算。然而,这完全是矫枉过正。您的组合可以从数据中得出,即每一行代表时期/月份/年龄的特定组合。由于您对每种组合的计算都是相同的,因此您只需编写一次 ifelse 命令。

注意:这目前只是将计算附加到您的数据集。是否足够完全未知(由于 To 缺乏关于预期结果的信息)。

df <- data.frame(month   = rep(c(1:9), times = 10),
                 age     = rep(c(1:5), times = 18),
                 period  = rep(c(1:3)),
                 value_1 = rep(c(0.1, 0.3, 0.4, 0.7, 0.9), times = 9))

library(tidyverse)
df %>%
  mutate(recode_down = if_else(value_1 - 1 <= 0, 0, value_1 - 1),
         recode_up   = value_1 + 1)

前 5 行的结果:

   period month age value_1 recode_down recode_up
1       1     1   1     0.1           0       1.1
2       2     2   2     0.3           0       1.3
3       3     3   3     0.4           0       1.4
4       1     4   4     0.7           0       1.7
5       2     5   5     0.9           0       1.9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多