У меня есть фрейм данных, который мне нужно сгруппировать по комбинации записей столбцов, чтобы условно изменить несколько столбцов, используя только оператор 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