我正在尝试在 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"
有什么建议吗?
编辑:问题是关于具有两个条件的循环。有没有办法将这个直接引用到具有治疗组和关税的数据框架,还是我只需要手动编写它?
答案 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"]))})