Одна строка, чтобы найти соответствующее значение в большом кадре данных - PullRequest
0 голосов
/ 06 ноября 2018

Я ищу простой однострочник, который поможет мне найти соответствующее значение в кадре данных.

Образец данных:

weather <-data.frame("date" = seq(as.Date("2000/1/1"), by ="days", length.out = 10), temp = runif(10))
weather
         date       temp
1  2000-01-01 0.08520875
2  2000-01-02 0.69003449
3  2000-01-03 0.85892903
4  2000-01-04 0.37790250
5  2000-01-05 0.04121786
6  2000-01-06 0.31550816
7  2000-01-07 0.86219597
8  2000-01-08 0.30844555
9  2000-01-09 0.96949855
10 2000-01-10 0.18851018

Допустим, теперь я хочу найти день, когда произошла максимальная температура:

max_temp <- max(weather$temp)
max_temp
[1] 0.9694985

Теперь есть несколько способов, которыми я могу найти дату этой температуры (то есть соответствующее значение, за которым я следую):

weather[which(weather$temp == max_temp), which(colnames(weather) == "date")]
[1] "2000-01-09"

Но это довольно трудоемко. Я также мог бы использовать dplyr:

library(dplyr)
filter(weather, temp == max_temp) %>%
   select(date)
        date
1 2000-01-09

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

Не могу не почувствовать, что должно быть что-то вроде:

function(df, name_of_known_variable, value_of_known_variable, character_vector_of_variables_of_interest)

Так что для этого примера это будет выглядеть (при условии, что функция «соответствует»):

correspond(weather, temp, max_temp, date)
1 2000-01-09

Я осмотрелся и не могу найти что-то простое для этого. Обратите внимание, что я понимаю, что могу использовать:

weather[which.max(weather$temp), 1]
[1] "2000-01-09"

Но давайте предположим, что я не обязательно ищу максимальную температуру (давайте представим, что у меня просто есть интересующее значение, и я пытаюсь найти соответствующее значение). Давайте также представим, что у меня есть массивный фрейм данных с большим и большим количеством столбцов (так много, чтобы сделать их подсчет трудоемким). Далее, давайте представим, что я хочу вернуть соответствующие значения из нескольких столбцов.

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

dplyr::slice также возможна здесь:

set.seed(1)
weather <-data.frame("date" = seq(as.Date("2000/1/1"), by ="days", length.out = 10), temp = runif(10))

library(dplyr)
weather %>% arrange(desc(temp)) %>% slice(1)

# A tibble: 1 x 2
        date      temp
      <date>     <dbl>
1 2000-01-07 0.9446753

И вы можете использовать dplyr::filter, если вам нужно найти конкретное значение

0 голосов
/ 06 ноября 2018

Превращение моего комментария в ответ, используя Base R только:

Создание данных, добавление еще двух столбцов для обеспечения более широкой перспективы:

set.seed( 1110 )
weather <-data.frame( "date" = seq( as.Date("2000/1/1"), by = "days", length.out = 10),
    temp = round( runif( 10 ), 2 ),
    loc = round( runif( 10 ) * 10, 2 ),
    speed = round( runif( 10 ) * 50, 1 ) )
> weather
         date temp  loc speed
1  2000-01-01 0.48 9.79  18.9
2  2000-01-02 0.79 9.20  18.6
3  2000-01-03 0.88 9.65  46.3
4  2000-01-04 0.58 0.59   5.3
5  2000-01-05 0.22 6.12  38.7
6  2000-01-06 0.09 3.05  42.6
7  2000-01-07 0.49 4.09   2.1
8  2000-01-08 0.99 8.60  31.9
9  2000-01-09 0.56 4.27  12.6
10 2000-01-10 0.36 6.02  42.7

Теперь мы можем выбирать для одной строки и на основе имен столбцов, а не чисел, как требуется:

# The day with the maximum temparature
weather[ weather$temp == max( weather$temp ), "date" ]
[1] "2000-01-08"

Но мы можем сделать гораздо больше:

# Speed and Location (order reversed) on the day with a temperature of 0.49
weather[ weather$temp == .49, c( "speed", "loc" ) ]
  speed  loc
7   2.1 4.09

# Date and speed, based upon two selection criteria (Temparature or Location)
# here we need to use which() to get the row indices
weather[ c( which( weather$temp == min( weather$temp ) ), which( weather$loc == 6.12 ) ), c( "date", "speed" ) ]  
        date speed
6 2000-01-06  42.6
5 2000-01-05  38.7
0 голосов
/ 06 ноября 2018

использовать пакет data.table. Синтаксис прост.

a[variable == value_you_want]
a[variable == max(variable]
a[variable == 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...