R - создание новых столбцов с критериями на основе других столбцов? - PullRequest
1 голос
/ 08 мая 2019

У меня есть следующая структура:

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 соответствовать min и max, а затем вычислять отношение hp / disp иначе он должен просто вернуть 0.

Возможно ли это как-то все сразу? Как бы я выстроил критерии?

1 Ответ

1 голос
/ 08 мая 2019

Нам может потребоваться создать логический вектор на основе условий

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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...