Почему case_when () вычисляет ложное условие?
У меня есть data.frame с групповой переменной и целочисленной переменной с отсутствующими данными.
df<-data.frame(group=c(1,1,2,2,3,3),a=as.integer(c(1,2,NA,NA,1,NA)))
Я хочу вычислить максимально доступное значение переменнойa
внутри каждой группы: в моем примере я должен получить 2 для группы 1,NA
для группы 2 и 1 для группы 3.
df %>% group_by(group) %>% mutate(max.a=case_when(sum(!is.na(a))==0 ~ NA_integer_,
T ~ max(a,na.rm=T)))
Приведенный выше код генерирует ошибку, по-видимому, потому что в группе 2 все значенияa
отсутствуют такmax(a,na.rm=T)
установлен на-Inf
, которое не является целым числом.
Почему этот случай вычислен для группы 2, тогда как условие ложно, как подтверждает следующая проверка?
df %>% group_by(group) %>% mutate(test=sum(!is.na(a))==0)
Я нашел обходной путь преобразованияa
чтобы удвоиться, но я все равно получаю предупреждение и недовольство тем, что не нашел лучшего решения.

3 ответа
case_when
оценивает всю правую часть условия независимо от того, выполняется условие или нет, поэтому вы получаете ошибку. Вы можете использоватьhablar::max_
который возвращаетсяNA
если все значенияNA
.
library(dplyr)
df %>%
group_by(group) %>%
mutate(max.a= hablar::max_(a)) %>%
ungroup
# group a max.a
# <dbl> <int> <int>
#1 1 1 2
#2 1 2 2
#3 2 NA NA
#4 2 NA NA
#5 3 1 1
#6 3 NA 1
Этот код выдает предупреждение, но он работает.
library(dplyr)
df %>%
group_by(group) %>%
dplyr::summarise(max.a = max(a, na.rm=TRUE))
Выход:
group max.a
<dbl> <dbl>
1 1 2
2 2 -Inf
3 3 1
Вместо использованияcase_when
Я бы предложил использоватьif ()
заявление вроде так:
library(dplyr)
df <- data.frame(group = c(1, 1, 2, 2, 3, 3), a = as.integer(c(1, 2, NA, NA, 1, NA)))
df %>%
group_by(group) %>%
mutate(max.a = if (all(is.na(a))) NA_real_ else max(a, na.rm = T))
#> # A tibble: 6 x 3
#> # Groups: group [3]
#> group a max.a
#> <dbl> <int> <dbl>
#> 1 1 1 2
#> 2 1 2 2
#> 3 2 NA NA
#> 4 2 NA NA
#> 5 3 1 1
#> 6 3 NA 1
Другие вопросы
- Создайте сводную таблицу двух категориальных и числовых переменных1 ответ
У меня есть следующий гипотетический фреймворкRegion <- c("District A", "District B","District A","District A","District B") Gender <- c("Male","Male","Female", "Male","Female") Age <- c(20, ...
- Создайте цикл для генерации имен столбцов в большом списке1 ответ
Я хотел бы создать цикл, чтобы изменить имена столбцов, как показано:a <- c("day", "month", "year", "flow") У меня есть большой список из 6937 элементов, которые мне удалось импортировать в R:library(tidyverse) library(readtext) txt_files_ls <- paste...
- Построение лаговой матрицы в R1 ответ
Каждый год несколько человек переезжают в деревню. Это представлено следующим вектором:x <- c(304, 213, 688, 400, 122, 449, 143, 90) Ежегодно из села уезжает 10% людей. Доля людей из каждой когорты, остающихся через определенное количество лет (за 10 лет):decay <- (1-0.1)^(0:10) Используя R, к...
- назначать имена столбцам фреймов данных в списке1 ответ
У меня есть список фреймов данных# Create dummy data df1<-data.frame( c(1,2,3),c(2,3,4)) df2<-data.frame(c(5,6,7),c(4,5,6)) # Create a list l<-list(df1, df2) Я хочу присвоить столбцам имена. В видеl[[1]][,1] дает мне доступ к первому столбцу, я думал, что могу назначить 'names' в ...
- Моя горизонтальная полоса обрезает текст, когда я сохраняю изображение. Как сделать полосы короче, а текст длиннее?1 ответ
Я новичок в R, так что простите мое невежество. Итак, я создал базовую горизонтальную гистограмму, используяbarplot( ). Мой текст на оси Y в основном исчезает. [IMG_OUR_ID=67.png] [IMG_OUR_ID=68.png] Есть ли способ удлинить и отобразить текст? Это мой код:barplot(mydata$`Sum Impact Risk`~mydata$`Eco...

"Завидую тестировщикам: все хотят с ними дружить."
case_when
векторизован. Вы используете его на скаляре, полученном в результатеsum
поэтому не работает должным образом. Используйте невекторизованный,if
как предлагается в ответе AnilGoyal