заменить, как указать как символ - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть эти данные, в которых я хочу заменить «20 октября» на «10-20» в столбце «глубина». Глубина является фактором здесь.

БАЭС

Вот что я пробовал:

BNPP <- BNPP %>%
  mutate(depth = replace(depth, depth == "20-Oct", "10-20"))

И я получил это сообщение об ошибке:

Warning message:
In `[<-.factor`(`*tmp*`, list, value = "10-20") :
  invalid factor level, NA generated

Поэтому я попытался исправить это, выполнив следующее:

BNPP <- BNPP %>%
  BNPP$depth <- as.character(BNPP$depth) %>%
  mutate(depth = replace(depth, depth == "20-Oct", "10-20"))

И я получил другое сообщение об ошибке:

 Error in UseMethod("mutate_") : 
      no applicable method for 'mutate_' applied to an object of class "character"

Я пытался поместить as.character вне фрагмента кода, и это сработало, но я понятия не имею, почему:

BNPP$depth <- as.character(BNPP$depth)
BNPP <- BNPP %>%
  mutate(depth = replace(depth, depth == "20-Oct", "10-20"))

Буду признателен за объяснение, почему первый не работает, а последний работает.

Ответы [ 2 ]

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

Проверьте это. Украл образец df из TC Zhang, но изменил имя в соответствии с вопросом.

library(hablar)
library(dplyr)

BNPP <- data.frame(
  plot = c(1,1,1),
  subplot = c("B","B", "B"),
  depth = c("0-10","20-Oct", "20-30")
)

BNPP %>% 
  convert(chr(depth)) %>% 
  mutate(depth = if_else(depth == "20-Oct", "10-20", depth))

дает

# A tibble: 3 x 3
   plot subplot depth
  <dbl> <fct>   <chr>
1     1 B       0-10 
2     1 B       10-20
3     1 B       20-30
0 голосов
/ 05 ноября 2018

Это похоже на проблему автокоррекции в Excel (что, кстати, смешно).

Сообщение об ошибке говорит о том, что «10-20» отсутствует в levels(BNPP$depth), поэтому вы не можете напрямую изменить «20-окт» на что-то другое.

Простое решение - преобразовать глубину BNPP $ в символьный вектор, а затем изменить его: (Во время теста я обнаружил, что mutate + gsub сделает преобразование за вас)

library(dplyr)

# data
df <- data.frame(
  plot = c(1,1,1),
  subplot = c("B","B", "B"),
  depth = c("0-10","20-Oct", "20-30")
)

# mutate depth

df.new <-
  df %>%
  mutate(depth = gsub("20-Oct","10-20", depth))

df.new
#>   plot subplot depth
#> 1    1       B  0-10
#> 2    1       B 10-20
#> 3    1       B 20-30

Создано в 2018-11-05 пакетом Представление (v0.2.1)

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