R - не удается обнаружить столбец с максимальным значением - PullRequest
2 голосов
/ 16 июня 2020

У меня есть набор данных с тремя столбцами (A, B, C). Каждый соответствует количеству яблок, бананов или моркови, которое ребенок съедает в день.

Для каждого дня я хочу регистрировать наиболее потребляемую пищу (т. Е. Столбец с наибольшим значением). Если значения в столбцах равны (например, 1 яблоко и 1 банан), применяется следующий ранг. Яблоко> Банан> Морковь: если ребенок съест 1 яблоко и 1 банан, в журнале будет указано яблоко.

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

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

library(tidyverse)

A <- c(1,1,3,3)
B <- c(2,3,1,1)
C <- c(1,1,1,2)
df <- data.frame(A,B,C)

top_food <- df %>% 
  mutate(highest = case_when(
    C > B ~ "carrot", # if carrot > banana
    C > A ~ "carrot", # if carrot > apple 
    B > A ~ "banana", # if banana > apple 
    B >= A ~ "banana", # if banana >= carrot
    A >= B ~ "apple", # if apple  >= banana
    A >= C ~ "apple" # if apple >= carrot
  )) 

> | A | B | C | HIGHEST |  |
> | 1 | 2 | 1 | banana  |  |
> | 1 | 3 | 1 | banana  |  |
> | 3 | 1 | 1 | apple   |  |
>   3 | 1 | 2 | carrot  |  |

1 Ответ

1 голос
/ 16 июня 2020

Позвольте мне изменить ваши данные, чтобы у нас действительно были связи, на которых мы могли видеть ваше правило приоритета (Apple> Banana> Carrot) в действии. Кроме того, я буду использовать несколько более информативные имена столбцов.

Apples <- c(1,1,3,3,4,4,1)
Bananas <- c(2,3,1,1,4,1,4)
Carrots <- c(1,1,1,2,1,4,4)
df <- data.frame(Apples,Bananas,Carrots)

Я позволю себе использовать базу R. В частности, я буду рассматривать df как matrix и apply функция which.max() для каждой строки.

result <- apply(as.matrix(df),1,which.max)

Это правильно обрабатывает ваше правило приоритета, потому что (1) which.max() возвращает индекс первого максимума, с которым оно сталкивается (см. ?which.max) и (2) df упорядочены по столбцам в правильном порядке приоритета.

Вот результат:

data.frame(df,Max=colnames(df)[result])

  Apples Bananas Carrots     Max
1      1       2       1 Bananas
2      1       3       1 Bananas
3      3       1       1  Apples
4      3       1       2  Apples
5      4       4       1  Apples
6      4       1       4  Apples
7      1       4       4 Bananas
...