我具有以下结构:
df <- head(mtcars[,c("cyl","disp","hp")])
criteria <- data.frame("cyl" = c(3,8), "disp" = c(180,380), "hp" = c(90,120),row.names = c("min","max"))
df
cyl disp hp
Mazda RX4 6 160 110
Mazda RX4 Wag 6 160 110
Datsun 710 4 108 93
Hornet 4 Drive 6 258 110
Hornet Sportabout 8 360 175
Valiant 6 225 105
> criteria
cyl disp hp
min 3 180 90
max 8 380 120
现在,我想创建一个新列,该列首先根据条件数据框架检查条件,然后计算比率。例如,我要创建一个名为“ disp / cyl”的列,该列应首先根据条件列检查disp和cycl列是否在最小值和最大值之间。如果是这种情况,则计算应为DISP / CYL之比。如果不是这种情况,则应仅返回0。同样,我要对名为“ hp / disp”的列执行相同的操作,在该列中,应检查disp和hp是否符合最小值和最大值,然后计算hp / disp的比率否则它应该只返回0。
这是否可能一劳永逸?我将如何建立标准?
答案 0 :(得分:1)
我们可能需要根据条件创建逻辑向量
i1 <- Reduce(`&`, Map(function(x, y) (x > y[1] & x < y[2]) &
(df$cyl > criteria$cyl[1] & df$cyl < criteria$cyl[2]), df[2:3], criteria[2:3]))
df$disp_cyl[i1] <- df$disp[i1]/df$cyl[i1]
df$hp_cyl[i1] <- df$hp[i1]/df$cyl[i1]
df <- replace(df, is.na(df), 0)
如果两列的条件都应分开,则请
df[c('disp_cyl', 'hp_cyl')] <- Map(function(x, y)
x/df$cyl *((x > y[1] & x < y[2]) &
(df$cyl > criteria$cyl[1] & df$cyl < criteria$cyl[2])),
df[2:3], criteria[2:3])