Нахождение максимального значения в строке, используя имя строки и сообщая о найденном значении и имени столбца - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть фрейм данных, который содержит четыре страны и три переменные x, y, z.Теперь я пытаюсь создать функцию, которая возвращает наибольшее значение определенной строки и имя столбца, который содержит наибольшее значение в строке.

           x           y          z 
Sweden  1.6534561  0.11523404  0.2261730 
France -1.2274320 -0.24096054  1.5096028
England -1.4503096  0.07227427  1.6740867
Spain  0.1867416  1.25318913 -0.7350560 

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

my_function(row_name){

value=
column=

paste("Highest value is", value, "and it is in column", column)
}

Например

my_function("Sweden") должен возвращать "Наивысшее значение равно 1.6534561 и находится в столбце x"

Ответы [ 3 ]

2 голосов
/ 28 сентября 2019

A tidyverse подход:

library(dplyr)
df %>% 
   mutate(ID= row.names(.)) %>% 
   tidyr::gather(key,val,-ID) %>% 
   group_by(ID) %>% 
   filter(val==max(val))
# A tibble: 4 x 3
# Groups:   ID [4]
  ID      key     val
  <chr>   <chr> <dbl>
1 Sweden  x      1.65
2 Spain   y      1.25
3 France  z      1.51
4 England z      1.67

Для создания функции ( Обратите внимание, что для этого может потребоваться некоторая нестандартная оценка ),

max_finder <- function(df, target_id){

   df %>% 
     mutate(ID= row.names(.)) %>% 
     tidyr::gather(key,val,-ID) %>% 
     group_by(ID) %>% 
     filter(val==max(val), ID ==target_id)

 }



max_finder(df,"Sweden")
# A tibble: 1 x 3
# Groups:   ID [1]
  ID     key     val
  <chr>  <chr> <dbl>
1 Sweden x      1.65

Данные :

df<- structure(list(x = c(1.6534561, -1.227432, -1.4503096, 0.1867416
    ), y = c(0.11523404, -0.24096054, 0.07227427, 1.25318913), z = c(0.226173, 
    1.5096028, 1.6740867, -0.735056)), class = "data.frame", row.names = c("Sweden", 
    "France", "England", "Spain"))
1 голос
/ 28 сентября 2019

my_function(row_name){

value=max(dataframe["row_name", ])
for(i in c(1:length(a["row_name",])) {
if(a["row_name",i] == value
column=names(dataframe)[i]
}
paste("Highest value is", value, "and it is in column", column)
}
1 голос
/ 28 сентября 2019

Я создал простой набор данных, который не идентичен, но очень похож на ваш.

Данные

df <- structure(list(x = 1:4, y = c(4, 8, 1, 6), z = c(3, 4, 1, 5)), class = "data.frame", row.names = c("Sweden", 
"France", "England", "Spain"))

Функция использует базовую индексацию и требует от васдополнительно укажите data.frame, вы можете удалить эту функцию, если хотите.

Функция

my_function <- function(Row, df){
 max <- max(df[Row, ])
 row <- which(df[Row, ] == max)
 paste("Highest value is", max, "and it is in column", names(df)[row])
}

> my_function("Sweden", df)
[1] "Highest value is 4 and it is in column y"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...