【问题标题】:Applying gsub to various columns将 gsub 应用于各种列
【发布时间】:2014-07-12 22:21:57
【问题描述】:

gsub 应用于各个列的最有效方法是什么? 以下不起作用

x1=c("10%","20%","30%")
x2=c("60%","50%","40%")
x3 = c(1,2,3)
x = data.frame(x1,x2,x3)
per_col = c(1,2)
x = gsub("%","",x[,per_col])

如何最有效地删除指定列中的“%”符号。 我可以将它应用于整个数据框吗?这在我不知道百分比列在哪里的情况下很有用。

【问题讨论】:

    标签: r dataframe gsub


    【解决方案1】:

    您可以使用apply 将其应用于整个data.frame

    apply(x, 2, function(y) as.numeric(gsub("%", "", y)))
         x1 x2 x3
    [1,] 10 60  1
    [2,] 20 50  2
    [3,] 30 40  3
    

    【讨论】:

    • 警告:apply() 返回一个矩阵而不是 data.frame
    【解决方案2】:

    或者,您可以尝试lapply 解决方案:

    as.data.frame(lapply(x, function(y) gsub("%", "", y)))
    
      x1 x2 x3
    1 10 60  1
    2 20 50  2
    3 30 40  3
    

    【讨论】:

    • 除了第二个问题之外,原帖还询问了如何将 gsub 应用于“指定列”。想评论一下如何使 gsub 仅适用于指定的列而不是所有列?
    • @WBarker: as.data.frame(lapply(x[c('x1','x2')], function(y) gsub("%", "", y))) ?诚然,。需要做一些工作来更新现有的列。
    • 这似乎返回了“list”类的列(每个项目都是一个包含字符串结果的列表长度)。有没有办法返回原始字符类的列
    【解决方案3】:

    要清理% 你可以这样做:

    x[per_col] <- lapply(x[per_col], function(y) as.numeric(gsub("%", "", y)))
    
    x
      x1 x2 x3
    1 10 60  1
    2 20 50  2
    3 30 40  3
    

    【讨论】:

      【解决方案4】:

      第一个答案有效,但如果您将 data.frame 与字符串一起使用,请小心:@docendo discimus 的答案将返回 NAs

      如果您想将列的内容保留为字符串,只需删除 as.numeric 并将您的表格转换为数据框:

      as.data.frame(apply(x, 2, function(y) as.numeric(gsub("%", "", y))))
           x1 x2 x3
      [1,] 10 60  1
      [2,] 20 50  2
      [3,] 30 40  3
      

      【讨论】:

      • 这在某种程度上也是@info_seekeR提出的解决方案
      【解决方案5】:

      要添加docendo discimus' answer,一个具有非相邻列的扩展并返回data.frame

      x1 <- c("10%", "20%", "30%")
      x2 <- c("60%", "50%", "40%")
      x3 <- c(1, 2, 3)
      x4 <- c("60%", "50%", "40%")
      
      x <- data.frame(x1, x2, x3, x4)
      
      x[, c(1:2, 4)] <- as.data.frame(apply(x[,c(1:2, 4)], 2,
                                               function(x) {
                                                 as.numeric(gsub("%", "", x))}
      ))
      
      > x
        x1 x2 x3 x4
      1 10 60  1 60
      2 20 50  2 50
      3 30 40  3 40
      
      > class(x)
      [1] "data.frame"
      

      【讨论】:

        【解决方案6】:

        我们可以unlistper_col列,去掉“%”符号,转换成数字。

        x[per_col] <- as.numeric(gsub("%","", unlist(x[per_col])))
        #In this case using sub would be enough too as we have only 1 % symbol to replace
        #x[per_col] <- as.numeric(sub("%","", unlist(x[per_col])))
        
        x
        #  x1 x2 x3
        #1 10 60  1
        #2 20 50  2
        #3 30 40  3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-03
          • 2012-04-18
          • 1970-01-01
          • 2012-08-06
          • 2021-09-17
          • 2018-09-10
          相关资源
          最近更新 更多