当前位置: 首页 > 知识库问答 >
问题:

tidyverse中跨多列的字符串替换

柴浩大
2023-03-14

我的数据帧

>df <- data.frame(Names = c("A", "B", "C"), Total = c("125", "2 500", "1 350"), 
>           Boys = c("50", "1 500", "350"),
>           Girls = c("75", "1 000", "1 000")) 
  Names Total  Boys Girls
1     A   125    50    75
2     B 2 500 1 500 1 000
3     C 1 350   350 1 000

所有值都是字符串。同学们,我想用空格代替非空格。我知道

df %>%
  mutate(Total = gsub(" ", "", Total),
         Boys = gsub(" ", "", Boys),
         Girls = gsub(" ", "", Girls))

但是有没有一种(tidyverse风格的)更普遍的方式来做到这一点呢?大约

df %>% # (This don't work)
  mutate(across(c(Total, Boys, Girls), gsub(" ", "", .x)))

也就是说,我正在寻找一种可以很好地扩展的解决方案。

提前致谢。

共有3个答案

有宏峻
2023-03-14

也许你可以试试下面的< code > gsub < code > as . matrix

type.convert(cbind(df[1], gsub("\\s+", "", as.matrix(df[-1]))), as.is = TRUE)

这给了

  Names Total Boys Girls
1     A   125   50    75
2     B  2500 1500  1000
3     C  1350  350  1000
姬捷
2023-03-14

我们可以使用str_remove中的stringr

library(stringr)
library(dplyr)
df %>% 
    mutate(across(-Names, ~ as.numeric(str_remove(., "\\s+"))))
#  Names Total Boys Girls
#1     A   125   50    75
#2     B  2500 1500  1000
#3     C  1350  350  1000
洪经义
2023-03-14

您可以使用:

library(dplyr)

df %>% mutate(across(c(Total, Boys, Girls), ~as.numeric(gsub(" ", "", .))))

#  Names Total Boys Girls
#1     A   125   50    75
#2     B  2500 1500  1000
#3     C  1350  350  1000

或在底座 R 与拉普利

df[-1] <- lapply(df[-1], function(x) as.numeric(gsub(" ", "", x)))
 类似资料:
  • 我试图基于不同列中的字符串匹配来有条件地替换多列中的值,但我希望能够使用cross()函数在单行代码中这样做,但我不断得到对我来说不太有意义的错误。我觉得这可能是一个简单的解决方案,所以如果有人能给我指出正确的方向,那将是很棒的! 这是产生此错误的数据的一个小样本: 错位关闭支架的诅咒!感谢大家的帮助...正确的解决方案是

  • 问题内容: 我有一些带有以下格式的方程式的字符串。 我还有一个文本文件,其中包含每个变量的名称,例如: 等等… 什么是对我来说,写代码的最佳方式,使其在插头到处发生,并且对等? 问题答案: 对于string ,请使用以下函数:

  • 我希望我的程序替换输入字符串中的每个元音。

  • 我有一个PHP脚本这是一个字符串替换函数,它接受数组中的字符,如果在字符串中找到任何字符,就替换它们。是否有与该函数等价的java函数。我找到了一些方法,但有些是使用循环,有些是重复语句,但在Java中没有找到类似的单行解决方案。

  • 问题内容: 有没有更短的方法可以编写以下代码? 注意,我不需要替换那些确切的值。我只是在寻找一种将5条以上的线变成少于5条线的方法 问题答案: 看起来是使用循环的好机会: 如果您不介意括号,则更快的方法是:

  • 我通常必须对一系列变量/列执行等价的计算,这些变量/列可以通过它们的后缀来标识(范围,假设从_a到_i),并将结果保存在新的变量/列中。计算是等效的,但计算中使用的变量不同。这些也可以通过相同的后缀(_a to _i)来识别。所以,我基本上想要达到的是: 这是我得到的最远的: 因此,我能够在oldvar1_a上“循环”到oldvar1_I,从中减去z,并将结果保存在名为oldvar1_a_new的