Условные суммы для строк фрейма данных с использованием dplyr - PullRequest
0 голосов
/ 28 июня 2018

Я новичок в dplyr / tidyverse, и я хотел бы суммировать строки набора данных, если значения в данном столбце (столбцах) превышают данное значение. Например, учитывая этот кадр данных,

a<-c(2,3,2,1,0)
b<-c(2,3,3,2,1)
z<-c(3,2,1,1,0)

data.abz <- data.frame(a,b,z)
data.abz

  a b z
1 2 2 3
2 3 3 2
3 2 3 1
4 1 2 1
5 0 1 0

Я хотел бы суммировать по строкам, если значение в столбце a или b больше 1 и если значение в столбце z больше 0. Если условие не выполняется, сумма строки равна 0. Например, учитывая предыдущий кадр данных, я хотел бы получить следующее,

  a b z sum_values
1 2 2 3          7
2 3 3 2          8
3 2 3 1          6
4 1 2 1          3
5 0 1 0          0

Последние две строки не удовлетворяют условию, и поэтому им было присвоено значение 0. Это то, что я сделал, но я уверен, что есть лучший способ добиться того же.

data.abz <- data.frame(a,b,z) %>%
mutate_at(vars(c(a,b)), 
      function(x) case_when(x < 2 ~ 0, TRUE~as.double(x)))%>%
mutate(sum_values = rowSums(.[1:3]))

Есть еще идиоматичные и лучшие идеи с R and dplyr?

1 Ответ

0 голосов
/ 28 июня 2018

Мне нравится использовать функцию dplyr case_when для условных вычислений. Но в зависимости от ваших потребностей вам может понадобиться что-то еще.

library(dplyr)

df <- tibble(a = c(2, 3, 2, 1, 0),
                b = c(2, 3, 3, 2, 1),
                z = c(3, 2, 1, 1, 0))

df <- df %>%
      mutate(sum_values = case_when((a > 1 | b > 1) & (z > 0) ~ (a+b+z),
                                    TRUE ~ 0))

Этот код дает результаты, отличные от ваших результатов (в частности, строка 4), но дайте мне знать, если он работает. Или дайте немного больше объяснений по вашему желаемому результату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...