Возвращать NA вместо Inf, когда аргументы функции отсутствуют - PullRequest
0 голосов
/ 10 июля 2020

Я хотел бы добавить столбец в фрейм данных с условием для другого столбца.

Вот пример. У меня есть простой фрейм данных

library(tidyverse)
set.seed(123)

df <- data.frame(time = seq(1,5,1), 
                 x = seq(1,5,1) + rnorm(n=5, sd=0.3))

> df
  time         x
1    1 0.8318573
2    2 1.9309468
3    3 3.4676125
4    4 4.0211525
5    5 5.0387863

. Я хотел бы добавить time, при котором x превышает определенное значение (например, x > 4), в новый столбец с именем border_value.

Следующий код действительно работает:

df <- df %>% mutate(border_value = min(.[.$x > 4, "time"]))

> df
  time         x border_value
1    1 0.8318573            4
2    2 1.9309468            4
3    3 3.4676125            4
4    4 4.0211525            4
5    5 5.0387863            4

Вопрос

У меня много фреймов данных, в которых значения для x различаются. Иногда значения не превышают border_value из x>4. В этих случаях R генерирует ошибку:

Предупреждающее сообщение: In min (. [. $ X> 4, "time"]): для min нет непустых аргументов; возвращая Inf

Я хотел бы изменить свой код, чтобы эта ошибка не возникала, а R вместо этого помещает NA в столбец. Есть идеи, как это сделать?

Обновление

На основе этого сообщения я смог переписать код на:

df <- df %>% 
   mutate(border_value = ifelse(test = is.infinite(min(.[.$x > 7, "time"])), yes = NA, no = min(.[.$x > 4, "time"])))

Это не генерирует Inf s, но все равно генерирует ошибку ...

1 Ответ

1 голос
/ 10 июля 2020

Есть много способов написать это. Вот пара, основанная на вашем варианте использования,

df %>% mutate(border_value = which(x > 4)[1])
df %>% mutate(border_value = time[x > 4][1])

Оба вернут NA, если значение не найдено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...