首页 > 解决方案 > 删除 data.frame R 中的空格

问题描述

我有一个 data.frame

test_data <- read.csv("https://stepik.org/media/attachments/course/724/test_data_01.csv", 
                       stringsAsFactors = FALSE)

这个 data.frame 看起来像这样:

 V1      V2       V3      V4       V5
1 -2. 5935    II 2   0.4984 ST 123E -2.154 4
2  -0.2888 ST 123E   1.5636 ST 123E   0.1053
3 -0.828 6 ST 123E -0.9 791  HP 129 -0. 4989
4  -0. 322 ST 123E  -0.3013  HP 129  -0.4032
5  -0.5588 ST 123E   1.2694  HP 129  0.703 9

我的目标: 1)只排序实数(V1、V3、V5)

num_test<-test_data[sapply(test_data, function(x) grepl("[A-Za-z]", x, perl = T))==F]

2)在实数(V1、V3、V5)中删除空格,然后将 V1、V3、V5 因子更改为数字

str_remove_all(num_test," ")

但我不明白如何返回 data.frame 并进行更改。它应该如下所示:

V1      V2      V3      V4      V5
1 -2.5935    II 2  0.4984 ST 123E -2.1544
2 -0.2888 ST 123E  1.5636 ST 123E  0.1053
3 -0.8286 ST 123E -0.9791  HP 129 -0.4989
4 -0.3220 ST 123E -0.3013  HP 129 -0.4032
5 -0.5588 ST 123E  1.2694  HP 129  0.7039

谢谢!

标签: rfunctiondataframeremoving-whitespace

解决方案


由于您使用str_replace_all的是 tidyverse。尝试这个:

library(dplyr)
test_data %>%
  mutate_at(vars(V1, V3, V5), ~ as.numeric(gsub("\\s", "", .)))
#        V1      V2      V3      V4      V5
# 1 -2.5935    II 2  0.4984 ST 123E -2.1544
# 2 -0.2888 ST 123E  1.5636 ST 123E  0.1053
# 3 -0.8286 ST 123E -0.9791  HP 129 -0.4989
# 4 -0.3220 ST 123E -0.3013  HP 129 -0.4032
# 5 -0.5588 ST 123E  1.2694  HP 129  0.7039

因为gsub它本身就很好。如果你喜欢stringr,那么

library(stringr)
test_data %>%
  mutate_at(vars(V1, V3, V5), ~ as.numeric(str_replace_all(., "\\s", "")))

编辑

要确定哪些列没有类似字母的数据,然后

test_data %>%
  mutate_if(~ !any(grepl("[A-Za-z]", .)),
            ~ as.numeric(str_replace_all(., "\\s", "")))

推荐阅读