Заменить символ в кадре данных другим символом - PullRequest
1 голос
/ 05 августа 2020

Я хочу изменить символ «F» на «X» в кадре данных. См. Ниже.

df <- data.frame(N=c(1,2,3,4,5,6),CAT=c('A','B','C','D','E','F'))
df

Result:
      N CAT
    1 1   A
    2 2   B
    3 3   C
    4 4   D
    5 5   E
    6 6   F

Я запустил этот код, но он не работает

    df$CAT[df$CAT == 'F'] <- 'X'

Error in `$<-.data.frame`(`*tmp*`, code, value = character(0)) : 
  replacement has 0 rows, data has 6

Кажется, этот код работает с другими данными, которые я импортировал через csv. Есть ли причина, по которой он не работает с этим конкретным c фреймом данных, который я создал? Любая помощь очень ценится.

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Это пресловутый stringsAsFactors=FALSE. Для тех, кто читает его после R4.0, это больше не проблема, но в течение многих лет до 2020 года пользователи изо всех сил пытались вспомнить, что data.frameas.data.frame(), если на то пошло) автоматически переводит все строки в факторы.

Затем происходит то, что вы пытаетесь ввести новые уровни в фактор, а это не то, как это нужно делать в R. Если создание фактора не было намерением, вы могли бы просто изменить код создания фрейма данных.

df <- data.frame(N=c(1,2,3,4,5,6),
                 CAT=c('A','B','C','D','E','F'),
                 stringsAsFactors = FALSE)

Однако, если вы хотите создать коэффициент, вот как вы можете go изменить уровни и перекодировать один из уровней.

df <- data.frame(N=c(1,2,3,4,5,6),
                 CAT=c('A','B','C','D','E','F'),
                 stringsAsFactors = TRUE)
df
str(df)
#> 'data.frame':    6 obs. of  2 variables:
#> $ N  : num  1 2 3 4 5 6
#> $ CAT: Factor w/ 6 levels "A","B","C","D",..: 1 2 3 4 5 6

levels(df$CAT)[levels(df$CAT)=="F"] <- "X"

df

#> N CAT
#> 1 1   A
#> 2 2   B
#> 3 3   C
#> 4 4   D
#> 5 5   E
#> 6 6   X
2 голосов
/ 06 августа 2020

Вы можете использовать функцию перекодирования из dplyr

df <- data.frame(N=c(1,2,3,4,5,6),CAT=c('A','B','C','D','E','F'))

df <- df %>% 
  mutate(CAT = recode(CAT, 'F'= 'X'))

df
...