【问题标题】:Reformatting Messy Data Frame Column in R在 R 中重新格式化凌乱的数据框列
【发布时间】:2013-10-18 02:16:47
【问题描述】:

我从 CSV 文件中导入了一个大型数据框,其中包含格式奇怪的数字数据。这是我正在使用的数据框的可重现示例:

df <- data.frame("r1" = c(1,2,3,4,5), "r2" = c(1,2.01,-3,"-","2,000"))

'r2' 包含带有负号的值,例如“-”,零值表示为破折号“-”。要对这个凌乱的 r2 列进行一些数值分析,我需要:

  1. 将“-”替换为零“0”,同时避免删除 负值前面的负号。
  2. 避免将“2,000”等合法值强制转换为 NA。出于某种原因,当我运行以下命令时:foo$row2&lt;- as.numeric(sub("-",0,foo$row2))R 将用逗号格式化的值强制转换为 NA,从而破坏了列中的数据。

下面是运行foo$row2&lt;- as.numeric(sub("-",0,foo$row2)) 后的输出示例:

Warning message:
NAs introduced by coercion 
  r1   r2
1 1  1.00
2 2  2.01
3 3  3.00
4 4  0.00
5 5   NA

如您所见,“2,000”被强制转换为 NA。 -3 被错误地转换为 3(删除了破折号)。但是,嘿,至少我们去掉了第 3 行的“-”,对吧!!!

这是我最终想要制作的:

 r1   r2
1 1  1.00
2 2  2.01
3 3  -3.00
4 4  0.00
5 5  2000

请注意,第 5 行的逗号已删除。列 r2 应该被格式化,以便我可以在其上运行像 sum(df$r2) 这样的命令。

【问题讨论】:

    标签: r


    【解决方案1】:

    你的方法是正确的。只需运行两次替换,一次删除只是破折号的任何内容,再一次删除任何逗号。

    df$r2<-as.numeric(gsub('^-$','0',gsub(',','',df$r2)))
    

    而且,如果您不熟悉正则表达式,^-$ 我的意思是只删除开头 (^)、破折号和结尾 ($) 的字符串。

    【讨论】:

      【解决方案2】:

      nograpes 的解决方案更酷:

      ## df <- data.frame("r1" = c(1,2,3,4,5), "r2" = c(1,2.01,-3,"-","2,000"))
      
      df$r2 <- as.numeric(gsub(",", "", df$r2))
      df$r2[is.na(df$r2)] <- 0
      
      ##   r1      r2
      ## 1  1    1.00
      ## 2  2    2.01
      ## 3  3   -3.00
      ## 4  4    0.00
      ## 5  5 2000.00
      

      【讨论】:

      • 他们看起来和我差不多。
      猜你喜欢
      • 2019-01-19
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多