为什么 sub(...) 函数会完全扭曲我的数据框?

Why does the sub(...) function completely distort my data frame?

奇怪的是,我在网上浏览时没有遇到这个问题。基本上我试图将 sub(...) 函数应用于一个简单的数据框。请参考以下范例:

x <- data.frame(name=c("Hans", "Dieter", "Peter"), age=c(25,26,27))
data <- data.frame(sub("e", "a", x)) #subbing an e for an a

输出完全改变了数据框,第一行现在包含:

c(“汉斯”、“迪亚特”、“彼得”)

第二个:

c(25, 26, 27)

有没有好心人帮帮我,让我明白是怎么回事?非常感谢!

sub() 函数并非设计用于作用于整个数据帧,而是作用于单个向量。

这应该有效:

x <- data.frame(name=c("Hans", "Dieter", "Peter"), age=c(25,26,27))
x
#>     name age
#> 1   Hans  25
#> 2 Dieter  26
#> 3  Peter  27

library(tidyverse)
data <- x %>% mutate(name = str_replace(name, "e", "a")) #subbing an e for an a
data
#>     name age
#> 1   Hans  25
#> 2 Diater  26
#> 3  Pater  27

或者没有管道的时候更短一些

data <- mutate(x, name = str_replace(name, "e", "a"))

reprex package (v0.3.0)

于 2021-01-05 创建

您可以使用带有 lapply 的基本 R 方法来使用修改后的值重新构建数据框:

## With regex enabled:
df[] <- lapply(df, gsub, pattern='a', replacement='e')
## Without regex, fixed string replacement:
df[] <- lapply(df, gsub, pattern='a', replacement='e', fixed=TRUE)

R demo online,输出:

    name age
1   Hens  25
2 Dieter  26
3  Peter  27

注意:由于 age 列类型因此更改为 char,您应该将列类型恢复为数字:

df$age <- as.numeric(df$age)

如果您只想对 char 类型的所有列执行替换,请使用

df <- data.frame(name=c("Hans", "Dieter", "Peter"), age=c(25,26,27), stringsAsFactors=FALSE)
chr_idx <- sapply(df, is.character)
df[chr_idx] <- lapply(df[chr_idx], gsub, pattern='a', replacement='e', fixed=TRUE)

参见 this R demo