Использование dplyr для group_by и условное изменение только с оператором if (без использования else) - PullRequest
0 голосов
/ 28 января 2019

У меня есть фрейм данных, который мне нужно сгруппировать по комбинации записей столбцов, чтобы условно изменить несколько столбцов, используя только оператор if (без условия else).

Более конкретно, я хочу подвести итогдо значений столбцов определенной группы, если они пересекают предварительно определенный порог, в противном случае значения должны оставаться неизменными.

Я попытался сделать это, используя if_else и case_when, но эти функции требуют либо«ложный» аргумент (if_else) или по умолчанию установленные значения, которые не соответствуют NA (case_when):

iris_mutated <- iris %>%
  dplyr::group_by(Species) %>%
  dplyr::mutate(Sepal.Length=if_else(sum(Sepal.Length)>250, sum(Sepal.Length)),
                Sepal.Width=if_else(sum(Sepal.Width)>170, sum(Sepal.Width)),
                Petal.Length=if_else(sum(Petal.Length)>70, sum(Petal.Length)),
                Petal.Width=if_else(sum(Petal.Width)>15, sum(Petal.Width)))

iris_mutated <- iris %>%
  dplyr::group_by(Species) %>%
  dplyr::mutate(Sepal.Length=case_when(sum(Sepal.Length)>250 ~ sum(Sepal.Length)),
                Sepal.Width=case_when(sum(Sepal.Width)>170 ~ sum(Sepal.Width)),
                Petal.Length=case_when(sum(Petal.Length)>70 ~ sum(Petal.Length)),
                Petal.Width=case_when(sum(Petal.Width)>15 ~ sum(Petal.Width)))

Есть идеи, как это сделать вместо этого?

Редактировать:

Вот пример ожидаемого результата.Сумма ширины лепестка для всех видово-сгруппированных записей составляет 12,3 для setosa , 101,3 для virginica и 66,3 для versicolor .Если мне требуется, чтобы эта сумма составляла не менее 15 для суммируемых значений (в противном случае следует сохранить исходное значение), тогда я ожидаю следующий вывод (показаны только столбцы «Petal.Width» и «Species»):

Petal.Width    Species
1           0.2     setosa
2           0.2     setosa
3           0.2     setosa
4           0.2     setosa
5           0.2     setosa
6           0.4     setosa
7           0.3     setosa
8           0.2     setosa
9           0.2     setosa
10          0.1     setosa
#...#
50          0.2     setosa
51          66.3 versicolor
52          66.3 versicolor
53          66.3 versicolor
#...#
100         66.3 versicolor
101         101.3  virginica
102         101.3  virginica
103         101.3  virginica
#...#
150         101.3  virginica

1 Ответ

0 голосов
/ 28 января 2019

Я думаю, что вы после этого?Используя метод Джонни.Вы не должны выдавать ошибку, когда вы используете исходное значение как часть case_when, если сумма не больше, чем предельное значение ...

iris_mutated <- iris %>% 
  group_by(Species) %>% 
  mutate(Sepal.Length = case_when(sum(Sepal.Length) > 250 ~ sum(Sepal.Length),
                                   T ~ Sepal.Length),
         Sepal.Width = case_when(sum(Sepal.Width) > 170 ~ sum(Sepal.Width),
                                   T ~ Sepal.Width),
         Petal.Length = case_when(sum(Petal.Length) > 70 ~ sum(Petal.Length),
                                   T ~ Petal.Length),
         Petal.Width = case_when(sum(Petal.Width) > 15 ~ sum(Petal.Width),
                                   T ~ Petal.Width))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...