为什么 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。
奇怪的是,我在网上浏览时没有遇到这个问题。基本上我试图将 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。