Изменить некоторые числовые значения во фрейме данных - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть фрейм данных с неверными значениями для двух переменных (широта и долгота).Неправильные значения в кадре данных указаны как 999,00, а правильные значения должны быть 42,68 и -72,47 соответственно.

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

df$Lat2 <- recode(df$Lat, "999.00"="42.68", .default=x)

Ошибка в lapply(x, f): объект 'x' не найден

df <- df %>%
mutate(Lat2 = if_else(Lat == 999.00, 42.68, NULL, NULL))

Ошибка в mutate_impl (.data, dots): Ошибка оценки: неиспользованный аргумент (recvLat = 999).

df <- df %>%
mutate(Lat2 = ifelse(Lat == 999.00, 42.68, NULL))

Ошибка в mutate_impl (.data, точки): Ошибка оценки: длина замены равна нулю.Кроме того: Предупреждающее сообщение: В rep (no, length.out = length (ans)): 'x' равно NULL, поэтому результатом будет NULL

df <- df %>%
mutate(Lat2 = case_when(Lat == 999.00 ~ 42.68, TRUE ~ NULL))

Ошибка в mutate_impl(.data, точки): Ошибка оценки: индекс за пределами.

Для последних трех попыток, я получаю ту же ошибку, если число в кавычках (то есть "999.00" и "42.68")

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

почему бы не использовать это.

data=as.data.frame(matrix(0,3,3))
names(data)=c("a","b","c")
data$a[1]=999
data$c[2]=999
data$a[which(data$a==999)]=42.68
data$c[which(data$c==999)]=-72.47
data
      a b      c
1 42.68 0   0.00
2  0.00 0 -72.47
3  0.00 0   0.00
0 голосов
/ 12 декабря 2018

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

library(data.table)

## Create example
data <- data.table(lat = c(999, 0, 0),
                   lon = c(0, 999, 0))

## Reassign values
data[lat==999, lat := 42.68]
data[lon==999, lon := -72.47]

## Print results
data
#      lat    lon
# 1: 42.68   0.00
# 2:  0.00 -72.47
# 3:  0.00   0.00

Недостатком является то, что вы должны помнить, что := необходим для назначения.

Достоинства

  • Вы можете ссылаться на переменные по имени без кавычек
  • Эффективное использование памяти, особенно важно для больших наборов данных
  • Не работаетt иметь зависимости
  • Синтаксис data.table намного проще и последовательнее (i, j, сгруппировать по)
  • Вам не нужно запоминать группу функций со странными именами, которые могут и/ или не может быть написан в австралийском стиле (например, цвет или суммирование)
  • Вы можете использовать базовую R больше, что делает ваш код более переносимым и широко понимаемым
  • Класс data.table наследует данныекласс .frame, поэтому он более совместим с R
0 голосов
/ 12 декабря 2018

Мы можем поместить NULL в list

df %>%
    mutate(Lat2 = ifelse(recvLat == 999.00, 42.68, list(NULL)))
#  recvLat  Lat2
#1   999.0 42.68
#2     1.5  NULL
#3     2.5  NULL

Вместо NULL, это может быть NA

df %>%
    mutate(Lat2 = ifelse(recvLat == 999.00, 42.68, NA_real_))
#  recvLat  Lat2
#1   999.0 42.68
#2     1.5    NA
#3     2.5    NA

Если мы хотим сделатьнапротив, просто используйте !=

df %>%
    mutate(Lat2 = ifelse(recvLat != 999.00, 42.68, NA_real_))

На основании комментария ОП,

df %>%
    mutate(Lat2 = ifelse(recvLat == 999.00, 42.68, recvLat))

В base R мы можем сделать это, создав индекс

i1 <- df$recvLat == 999
df$recLat[i1] <- 42.68

ПРИМЕЧАНИЕ. Оба решения работают.

данные

df <- data.frame(recvLat = c(999, 1.5,  2.5))
...