【问题标题】:Replace strings in data frame columns with integer in R用R中的整数替换数据框列中的字符串
【发布时间】:2013-10-17 21:14:49
【问题描述】:

我有一个名为“foo”的数据框:

 foo <- data.frame("row1" = c(1,2,3,4,5), "row2" = c(1,2.01,3,"-","-"))

'foo' 是从另一个程序作为 CSV 文件上传的,有两列。一种是数值数据类型,另一种是因子数据类型。

str(foo)
'data.frame':   5 obs. of  2 variables:
$ row1: num  1 2 3 4 5
$ row2: Factor w/ 4 levels "-","1","2.01",..: 2 3 4 1 1

注意有破折号,例如"-" ,在 foo$row2 中,这会导致该列成为一个因素。我想用零替换破折号,这样 data.class(foo$row2) 将返回“数字”。这个想法是替换每列中的所有破折号,以便我可以使用 R 对其进行数字分析。

在 R 中最简单的方法是什么?

谢谢,

【问题讨论】:

    标签: r


    【解决方案1】:

    问:这个想法是替换每列中的所有破折号,以便我可以用 R 对其进行数值分析。

    applysapplysub 一起使用

     kk<-data.frame(apply(foo,2,function(x) as.numeric(sub("-",0,x))))
    > kk
      row1 row2
    1    1 1.00
    2    2 2.01
    3    3 3.00
    4    4 0.00
    5    5 0.00
    
    > str(kk$row2)
     num [1:5] 1 2.01 3 0 0
    

    或者,您可以使用sapply

    kk<-data.frame(sapply(names(foo),function(x)as.numeric(sub("-",0,foo[,x]))))
    

    更新: 如果你只想要第二列,你不需要使用apply:foo$row2&lt;- as.numeric(sub("-",0,foo[,2]))

    【讨论】:

    • 这是否将字符串替换功能应用于数据框中的每一列?如果是这样,我怎样才能只定位第二列?谢谢!
    • 是的,它适用于所有列。如果你只想要第二个col,你不需要使用apply:foo$row2&lt;- as.numeric(sub("-",0,foo[,2]))
    • 不是为第二列索引调用 foo[,2] ,而是如何按列名调用它,即 foo$row2
    • @AME 你看过其他答案了吗?这正是我发布的内容。
    【解决方案2】:

    这是一种简单的方法。可能有更优雅的方式,但这会奏效:

    > foo <- data.frame("row1" = c(1,2,3,4,5), "row2" = c(1,2.01,3,"-","-"))
    > levels(foo$row2)[levels(foo$row2)=="-"]<-0
    > foo$row2<-as.numeric(as.character(foo$row2))
    > class(foo$row2)
    [1] "numeric"
    > foo
      row1 row2
    1    1 1.00
    2    2 2.01
    3    3 3.00
    4    4 0.00
    5    5 0.00
    

    【讨论】:

      【解决方案3】:

      我会为此使用ifelse()foo$row2 &lt;- ifelse(foo$row2 == "-", 0, as.numeric(foo$row2))

      您可能还需要 as.character() 才能从因子转换为字符

      【讨论】:

      • 还有一个 as.numeric 将其转换为 OP 需要的数字形式。
      • 在真实数据集(不是此处显示的示例)上运行此代码会返回 #NA Coerced。我试图在其上运行此函数的真实数据集包含逗号,例如1,000。这似乎强制使用您提供的命令进行#NA 强制。
      【解决方案4】:

      gsub...

      as.numeric( gsub("-" , 0 , foo[,2] ) )
      #[1] 1.00 2.01 3.00 0.00 0.00
      

      【讨论】:

        猜你喜欢
        • 2014-02-06
        • 2023-02-23
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 2016-11-01
        • 2021-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多