Используя mutate, if_else и replace, я получаю In x [list] <- values: количество заменяемых элементов не кратно длине замены - PullRequest
0 голосов
/ 10 июля 2020

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

У меня есть следующие данные (отредактированы, добавлены полные реальные данные):

structure(list(Expo = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("DC", "DI"), class = "factor"), 
    day = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 
    5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
    5L, 5L, 5L, 5L, 5L, 5L, 5L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
    7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
    7L, 7L, 7L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
    9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 
    10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
    10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
    10L, 10L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
    5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 7L, 7L, 7L, 
    7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
    7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 9L, 9L, 9L, 9L, 9L, 9L, 
    9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L), SYN = c("S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U", "N", "S", "U", "N", "S", "U", "N", 
    "S", "U", "N", "S", "U"), freq.n = c(19L, 6L, 1L, 4L, 2L, 
    3L, 2L, 1L, 12L, 10L, 1L, 1L, 1L, 1L, 24L, 4L, 1L, 1L, 3L, 
    1L, 1L, 8L, 49L, 9L, 2L, 3L, 6L, 3L, 2L, 1L, 12L, 7L, 2L, 
    1L, 2L, 1L, 1L, 2L, 1L, 2L, 38L, 3L, 3L, 1L, 3L, 1L, 1L, 
    2L, 4L, 2L, 105L, 7L, 4L, 3L, 1L, 1L, 2L, 5L, 11L, 21L, 2L, 
    1L, 2L, 1L, 1L, 2L, 3L, 67L, 5L, 2L, 6L, 4L, 1L, 1L, 9L, 
    4L, 97L, 19L, 10L, 3L, 6L, 1L, 2L, 2L, 12L, 12L, 2L, 1L, 
    1L, 2L, 2L, 4L, 95L, 14L, 8L, 2L, 2L, 1L, 1L, 4L, 5L, 153L, 
    56L, 13L, 10L, 2L, 4L, 3L, 5L, 4L, 12L, 12L, 1L, 2L, 1L, 
    2L, 1L, 2L, 82L, 33L, 10L, 6L, 3L, 2L, 2L, 2L, 4L, 6L, 82L, 
    3L, 2L, 1L, 3L, 1L, 2L, 3L, 20L, 5L, 3L, 30L, 7L, 5L, 3L, 
    2L, 1L, 2L, 1L, 66L, 10L, 4L, 1L, 1L, 1L, 2L, 23L, 1L, 3L, 
    5L, 3L, 53L, 11L, 3L, 1L, 108L, 18L, 10L, 3L, 1L, 1L, 2L, 
    3L, 14L, 1L, 1L, 2L, 2L, 3L, 2L, 101L, 14L, 4L, 1L, 122L, 
    33L, 9L, 1L, 1L, 2L, 3L, 2L, 3L, 9L, 10L, 2L, 1L, 2L, 1L, 
    1L, 1L, 65L, 20L, 2L, 5L, 2L, 1L, 3L, 2L, 1L, 3L, 11L, 3L, 
    3L, 1L, 1L, 4L, 2L, 1L, 1L, 1L, 6L, 2L, 2L, 1L, 1L)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -224L))

Я запустил следующий код:

library(dplyr)

q = c("3" = "1",
      "5" = "3",
      "7" = "5",
      "9" = "7",
      "10" = "8")

Pi %>% 
mutate(day = if_else(Expo == "DC", 
                     replace(day, day == day, q), as.character(day)))

Я получаю это предупреждение In x [list] <- values: количество заменяемых элементов не кратно длине замены </strong> со следующим результатом.

После изменения вопроса: Подмножество примеров того, что я получаю.

# A tibble: 6 x 6
  Expo  day   SYN   freq.n
  <fct> <chr> <chr>  <int>
1 DC    1     S         19
2 DC    3     U          6
3 DC    5     N          1
4 DC    7     S          4
5 DC    8     U          2
6 DC    1     N          3

Очевидно, что в «день» назначаются неправильные значения.

Ожидаемый результат должен быть:

# A tibble: 6 x 6
  Expo  day   SYN   freq.n 
  <fct> <chr> <chr>  <int>
1 DC    1     S         19
2 DC    1     U          6 
3 DC    1     N          1 
4 DC    1     S          4 
5 DC    1     U          2 
6 DC    1     N          3 

Дело в том, что та же самая строка кода отлично работает с аналогичным tbl.

Я был бы признателен за комментарий, который может указать мне на в правильном направлении.

Заранее большое спасибо.

1 Ответ

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

Используйте dplyr::case_when ... делает ли это то, что вы хотите?

case_when позволяет применять несколько условий к вектору, в данном случае только для одного условия, поэтому case_when работает как if else condition:

Условие определяется как Expo == "DC", когда оно истинно, формула с тильдой «~» побуждает к действиям, а именно замене значения day из именованного вектора. Вторая часть case_when, т.е. TRUE ~ as.character(day) убирает неразрешенные элементы вектора, ее можно рассматривать как часть "else", а если еще - условную, то есть она имеет дело со всеми случаями, когда (интуитивно противоречиво) результат условие - ЛОЖЬ. Другой способ взглянуть на это - сказать, что все элементы, на которые не повлиял предыдущий case_when, имеют значение TRUE, а ~ позволяет R знать, что с ними делать.


library(dplyr)
library(stringr)

df %>% 
  mutate(day = case_when(Expo == "DC" ~ str_replace_all(day, q),
                         TRUE ~ as.character(day))) %>% 
  head(20)
#> # A tibble: 20 x 4
#>    Expo  day   SYN   freq.n
#>    <fct> <chr> <chr>  <int>
#>  1 DC    1     S         19
#>  2 DC    1     U          6
#>  3 DC    1     N          1
#>  4 DC    1     S          4
#>  5 DC    1     U          2
#>  6 DC    1     N          3
#>  7 DC    1     S          2
#>  8 DC    1     U          1
#>  9 DC    1     N         12
#> 10 DC    1     S         10
#> 11 DC    1     U          1
#> 12 DC    1     N          1
#> 13 DC    1     S          1
#> 14 DC    1     U          1
#> 15 DC    1     N         24
#> 16 DC    1     S          4
#> 17 DC    1     U          1
#> 18 DC    1     N          1
#> 19 DC    1     S          3
#> 20 DC    1     U          1

Создано 2020-07- 10 с помощью пакета REPEX (v0.3.0)

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