用另一个字符替换数据框中的字符

时间:2020-08-05 20:34:31

标签: r dataframe replace string-substitution

我想在数据框中将字符“ 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导入的其他数据。有什么原因不能与我创建的此特定数据框一起使用吗?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

这是众所周知的stringsAsFactors=FALSE。对于那些在R4.0之后阅读它的人来说,这不再是一个问题,但是在2020年之前的许多年中,用户一直在努力地想起data.frame(和as.data.frame()会自动将所有字符串强制转换为因子)。

然后发生的是,您正在尝试将新级别引入到因素中,而这并不是R中需要这样做的方式。如果不是要创建因素,则只需修改数据框架创建代码即可。

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

但是,如果您想创建一个因子,可以按照以下方法修改级别并重新编码其中一个级别。

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

答案 1 :(得分:2)

您可以使用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