R Tidyverse — определить долю выбранных столбцов, соответствующих критериям

У меня есть такие данные:

x1 = seq(0, 2, length=5)
x2 = seq(1, 2, length=5)
x3 = seq(0, 1, length=5)
df = data.frame(rbind(x1,x2,x3))

Я хотел бы получить долю определенных столбцов (на основе имени), которые имеют значение меньше 1. Далее выбираются переменные, содержащие «x» в имени, и суммируются значения в столбцах.

df <- df %>% 
  mutate(sumVar = rowSums(select(., contains("x")), na.rm = TRUE))

Есть ли способ включить логику ifelse в эту настройку, чтобы определить пропорцию столбцов со значениями ‹ 1 (в отличие от вычисления суммы, как здесь)? Я использую функцию «содержит», так как хочу рассчитать это для большего количества столбцов, которые не обязательно расположены по порядку, но имеют один и тот же шаблон в своем имени.


person Jason Schoeneberger    schedule 17.04.2020    source источник


Ответы (2)


Вы можете использовать rowMeans() при условии:

library(dplyr)

df %>% 
  mutate(propVar = rowMeans(select(., contains("x")) < 1))

   x1   x2   x3   propVar
1 0.0 1.00 0.00 0.6666667
2 0.5 1.25 0.25 0.6666667
3 1.0 1.50 0.50 0.3333333
4 1.5 1.75 0.75 0.3333333
5 2.0 2.00 1.00 0.0000000
person 27 ϕ 9    schedule 17.04.2020
comment
В качестве продолжения могу ли я просто сделать следующее, если я хочу, чтобы вычислялось только среднее значение по переменным, которые равны как > 0, так и ‹ 1? df %›% mutate (propVar = rowMeans (выбрать (., содержит (x)) ‹ 0 и выбрать (., содержит (x)) ‹ 1)) - person Jason Schoeneberger; 22.04.2020
comment
Да, хотя в коде опечатка (< используется дважды). df %>% mutate(propVar = rowMeans(select(., starts_with("X")) > 0 & select(., starts_with("X")) < 1)). - person 27 ϕ 9; 23.04.2020
comment
Ага... понял! Спасибо за подтверждение! - person Jason Schoeneberger; 23.04.2020

Мы можем использовать rowMeans в base R

df$propVar <- rowMeans(df[startsWith(names(df), "x")]<1)
person akrun    schedule 17.04.2020