R-使用基于其他列的条件创建新列?

时间:2019-05-08 11:27:01

标签: r

我具有以下结构:

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。

这是否可能一劳永逸?我将如何建立标准?

1 个答案:

答案 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])