首页 > 解决方案 > 如何通过 R 中的单个空格 gsub 数据框中的所有多个空格

问题描述

我想通过整个数据框中的单个空格替换所有多个空格。

IE

v1 <- c("Aluminium           ,          Kunststoff", "Kunststoff       ,     Stahl     ,    Stoff")
v2 <- c("230      V", "    24      W")
df <- data.frame(v1, v2)

结果应该是:

                     v1        v2
1 Aluminium , Kunststoff       230 V
2 Kunststoff , Stahl , Stoff   24 W

我试过这个,但它不起作用:

data.frame(lapply(df, function(x) {
                  gsub(" {2,}", " ", x)
              }))

如果逗号前没有空格,那当然是最佳选择。否则我会在下一步中做到这一点。

非常感谢

标签: rdataframewhitespacegsub

解决方案


如果您的数据框列是字符类型,并且您需要用单个空格替换任何一个或多个空白块,则可以使用

df[] <- lapply(df, function(x) gsub("\\s+", " ", x))

要删除逗号前的空格,并在逗号后保留一个空格,您可以使用

df[] <- lapply(df, function(x) gsub("\\s*(,)\\s*|\\s+", "\\1 ", x))

请参阅正则表达式演示\s*(,)\s*|\s+匹配零个或多个空格、逗号(捕获到第 1 组)和零个或多个空格或一个或多个空格,并用第 1 组 + 文字空格替换匹配项。

要删除逗号周围的空格,您可以使用

df[] <- lapply(df, function(x) gsub("\\s*(,)\\s*|(\\s)+", "\\1\\2", x))

注意:在最后一个示例中,用作多个空白块的替换字符的空间将是块中的最后一个空白字符。

请参阅正则表达式演示。正则表达式与上面的类似,但最后一个\s被捕获到第 2 组中并用于所谓的“重复捕获组”,其中只有最后一个捕获的值保存在组中。

请参阅在线 R 演示

v1 <- c("Aluminium           ,          Kunststoff", "Kunststoff       ,     Stahl     ,    Stoff")
v2 <- c("230      V", "    24      W")
df <- data.frame(v1, v2)

lapply(df, function(x) gsub("\\s+", " ", x))
## => [1] "Aluminium , Kunststoff"     "Kunststoff , Stahl , Stoff"
###   [1] "230 V" " 24 W"
lapply(df, function(x) gsub("\\s*(,)\\s*|\\s+", "\\1 ", x))
## => [1] "Aluminium, Kunststoff"     "Kunststoff, Stahl, Stoff"
###   [1] "230 V" " 24 W"
lapply(df, function(x) gsub("\\s*(,)\\s*|(\\s)+", "\\1\\2", x))
## => [1] "Aluminium,Kunststoff"     "Kunststoff,Stahl,Stoff"
###   [1] "230 V" " 24 W"

推荐阅读