【问题标题】:Generate new variable based on table of conditions根据条件表生成新变量
【发布时间】:2017-07-11 09:36:18
【问题描述】:

我正在尝试在 R 中编写一个循环,它根据条件结果表创建一个新变量。

我有四个治疗组(A、B、C、D)。每个治疗组在三个不同的时间段(白天、晚餐、晚上)支付不同的价格。

Treatment Group    Day Price      Dinnertime Price       Night Price
A                     10                 20                   7
B                     11                 25                   8
C                     12                 30                   9
D                     13                 35                   10

时间段记录为给定的“小时”(白天是 8-17 小时,晚餐是 17-19 小时,晚上是 19-0 和 0-8 小时)。

               Hour        Usage
   Person 1      1            0
   Person 1      2            0
   Person 2      20           5
   Person 3      17           6

根据治疗组(A、B、C 和 D)和一天中的时间(晚上、白天、晚餐时间),我想创建一个新的价格向量。

理想情况下,我会根据这些每小时条件为每个时间段(白天、晚上和晚餐)创建虚拟变量。但是,我的数据集非常大(每人每天 24 次观察),所以我正在寻找更优雅的解决方案。

用简单的语言,我想要这个:

 if group==A & time==night, then price=7 --> and this information saved in a new variable "price"

有什么建议吗?

编辑:问题是关于具有两个条件的循环。有没有办法将其直接引用到带有治疗组和关税的数据框,还是我只需要手动编写?

【问题讨论】:

  • 我不清楚价格从何而来,但您可以使用cut() 将小时重构为一天中的时间
  • 价格仅由治疗组决定。谢谢你的提示。当我有两个条件时,我可以运行什么样的循环?我希望它只引用具有治疗组的数据框,而不是单独指定条件
  • 我认为您需要进一步澄清。比如:哪些数据帧已经可用(两者都可用?)以及您想要的输出是什么?您想在第二个数据框中包含价格变量吗?
  • 是的,抱歉 - 两个数据框都已可用。如上所示,根据一天中的时间和治疗组有不同的价格我试图创建一个与该时间段和治疗相对应的价格列表(因此是一个新变量)。因此,如果时间是上午 8 点,治疗组 A,那么价格是 x。这不是一个复杂的计算,但我现在确定如何告诉 R 怎么做

标签: r loops


【解决方案1】:

假设您有某种方法可以在数据框中为每个人所属的组添加一列,其中包含交易。那么这样的事情可能对你有用。

df.pricing <- structure(list(Treatment.Group = c("A", "B", "C", "D"), Day.Price = 10:13, 
                             Dinnertime.Price = c(20L, 25L, 30L, 35L), Night.Price = 7:10), 
                        .Names = c("Treatment.Group", "Day.Price", "Dinnertime.Price", "Night.Price"), 
                        class = "data.frame", 
                        row.names = c(NA, -4L))

df.transactions <- structure(list(Person = c("Person1", "Person1", "Person2", "Person3", "Person4"), 
                                  Hour = c(1L, 2L, 20L, 17L, 9L), 
                                  Usage = c(0L, 0L, 5L, 6L, 2L)), 
                             .Names = c("Person", "Hour", "Usage"), 
                             class = "data.frame", row.names = c(NA, -5L))

# Add the group that each person belongs to
df.transactions$group <- c("A","A","B","C","D")

# Get the transaction price
df.transactions$price <- apply(df.transactions, 1, function(x){
                                                 hour <- as.numeric(x[["Hour"]])
                                                 price <- ifelse(hour >= 8 & hour <= 16, df.pricing[df.pricing$Treatment.Group == x[["group"]], "Day.Price"],
                                                                 ifelse((hour > 16 & hour <= 18), df.pricing[df.pricing$Treatment.Group == x[["group"]], "Dinnertime.Price"],
                                                                        df.pricing[df.pricing$Treatment.Group == x[["group"]], "Night.Price"]))})

【讨论】:

    猜你喜欢
    • 2020-12-09
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2017-09-14
    • 2013-04-15
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多