根据条件表生成新变量

时间:2017-07-11 09:36:19

标签: r loops

我正在尝试在 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"

有什么建议吗?

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

1 个答案:

答案 0 :(得分:0)

假设您有某种方法可以在数据框中包含每个人所属的组的列,并在其上包含事务。那么这样的事情可能适合你。

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"]))})