我正在研究一个非检测数据框,用'<'编码.有时在'<'之后有一个空格,有时不是例如'<2'或'<2'.我想删除每一个空间.
例:
data <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep('< 2', 9), var2 = rep('<3', 9))
name var1 var2
1 a < 2 <3
2 b < 2 <3
3 c < 2 <3
Run Code Online (Sandbox Code Playgroud)
这是我必须要做的:
我可以提取所有值并创建新字符串,但我不能将它们放回数据框中.
index <- str_detect(unlist(data), '<')
index <- matrix(index, nrow = 3)
data[index]
#[1] "< 2" "< 2" "< 2" "<3" "<3" "<3"
replacements <- str_replace_all(data[index], "<[ ]+","<")
replacements
#[1] "<2" "<2" "<2" "<3" "<3" "<3"
data[index] <- replacements
#Error in `[<-.data.frame`(`*tmp*`, index, value = c("<2", "<2", "<2", :
# unsupported matrix index in replacement
Run Code Online (Sandbox Code Playgroud)
Tim*_*sen 35
如果您只想"< "用"<"(没有空格)替换所有出现的(带空格),那么您可以lapply在数据框上做一个gsub替换:
> data <- data.frame(lapply(data, function(x) {
+ gsub("< ", "<", x)
+ }))
> data
name var1 var2
1 a <2 <3
2 a <2 <3
3 a <2 <3
4 b <2 <3
5 b <2 <3
6 b <2 <3
7 c <2 <3
8 c <2 <3
9 c <2 <3
Run Code Online (Sandbox Code Playgroud)
Net*_*tle 30
相当于"查找和替换".不要过度思考它.
试一试:
library(tidyverse)
df <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep('< 2', 9), var2 = rep('<3', 9))
df %>%
mutate(var1 = str_replace(var1, " ", ""))
#> name var1 var2
#> 1 a <2 <3
#> 2 a <2 <3
#> 3 a <2 <3
#> 4 b <2 <3
#> 5 b <2 <3
#> 6 b <2 <3
#> 7 c <2 <3
#> 8 c <2 <3
#> 9 c <2 <3
Run Code Online (Sandbox Code Playgroud)
全部应用
df %>%
mutate_all(funs(str_replace(., " ", "")))
#> name var1 var2
#> 1 a <2 <3
#> 2 a <2 <3
#> 3 a <2 <3
#> 4 b <2 <3
#> 5 b <2 <3
#> 6 b <2 <3
#> 7 c <2 <3
#> 8 c <2 <3
#> 9 c <2 <3
Run Code Online (Sandbox Code Playgroud)
如果通过联合列生成额外空间,请考虑制作str_trim工作流程的一部分.
由reprex包(v0.2.0)于2018-03-11创建.
Ric*_*ven 15
要删除每列中的所有空格,您可以使用
data[] <- lapply(data, gsub, pattern = " ", replacement = "", fixed = TRUE)
Run Code Online (Sandbox Code Playgroud)
或者将其限制在第二和第三列(即除第一列之外的每一列),
data[-1] <- lapply(data[-1], gsub, pattern = " ", replacement = "", fixed = TRUE)
Run Code Online (Sandbox Code Playgroud)
Ton*_*son 11
这是一个dplyr解决方案
library(dplyr)
library(stringr)
Censor_consistently <- function(x){
str_replace(x, '^\\s*([<>])\\s*(\\d+)', '\\1\\2')
}
test_df <- tibble(x = c('0.001', '<0.002', ' < 0.003', ' > 100'), y = 4:1)
mutate_all(test_df, funs(Censor_consistently))
# A tibble: 4 × 2
x y
<chr> <chr>
1 0.001 4
2 <0.002 3
3 <0.003 2
4 >100 1
Run Code Online (Sandbox Code Playgroud)
小智 10
作为对 @Nettle 答案的更新,mutate_all()已被以下取代mutate( across( ... ) ):
library(tidyverse)
df <- data.frame(
name = rep( letters[1:3], each = 3 ),
var1 = rep( '< 2', 9 ),
var2 = rep( '<3', 9 )
)
df %>%
mutate( across(
.cols = everything(),
~str_replace( ., " ", "" )
) )
#> name var1 var2
#> 1 a <2 <3
#> 2 a <2 <3
#> 3 a <2 <3
#> 4 b <2 <3
#> 5 b <2 <3
#> 6 b <2 <3
#> 7 c <2 <3
#> 8 c <2 <3
#> 9 c <2 <3
Run Code Online (Sandbox Code Playgroud)
我遇到了问题,我不得不用“不可用”替换NA,我的解决方案是这样的
data <- sapply(data,function(x) {x <- gsub("Not Available",NA,x)})
Run Code Online (Sandbox Code Playgroud)