【问题标题】:R sweep a dataframe for characters, but only in the parameter columnsR扫描字符的数据帧,但仅在参数列中
【发布时间】:2021-03-16 05:26:30
【问题描述】:

如果我有一个看起来有点像这样的 .csv(名称和地点已更改以保护无辜者)并作为数据帧 df 读入

     Species          Place  param1 param2 param3
1     D.lice        on head 123.123     39  65.43
2 X.elephant        up butt 234.400  *****       
3   B.booger        in nose  32.000   <NA>  $%(*0
4    F.farts      blame dog  -9.990     43       

如何删除所有字符“单元格”并将它们替换为空值“”(不是 NULL),只留下数字(重要的是,具有 num(或数字)类型的列,以便我可以停止错误像这样Error in hist.default(testParam) : 'x' must be numeric 其中testParam 是其中一列?

我想到了sweep,并且一直在尝试replace 的各种实现,但我似乎无法让它们中的任何一个在它们只影响参数列以及它们可以拾取的地方工作任何由各种参数生成器插入的可能的字符/字符串。

【问题讨论】:

    标签: r dataframe replace character


    【解决方案1】:

    您可以尝试检测param 列中只有数字(可能有一个点)的值,然后替换没有数字的值,然后将其转换为数字。

    例子:

    df <- data.frame(
      species = letters[1:5],
      param1 = c("123.56", "23", "ds%", "12.ab", "123"),
      param2 = c("%23", "43.23", "abc", "45", "0.23"),
      stringsAsFactors = FALSE
    )
    
    library(dplyr)
    library(stringr)
    
    df %>%
      mutate(
        across(
          matches("^param[0-9]+"),
          ~ifelse(str_detect(.x, "^[0-9]+\\.{0,1}[0-9]*$"), .x, NA_character_) %>%
            as.numeric()
        )
      )
    

    给予:

      species param1 param2
    1       a 123.56     NA
    2       b  23.00  43.23
    3       c     NA     NA
    4       d     NA  45.00
    5       e 123.00   0.23
    

    其中param 列是数字。

    注意:param 列必须是字符而不是因子。如果它们是因素,则需要将它们转换为字符。

    【讨论】:

    • 我在一个循环中使用它,一次测试一个参数列,所以在您对ifelsestr_detect 的指导下,我使用了这个:if(is.character(df[ ,i])){testing &lt;- as.numeric(ifelse(str_detect(df[ ,i], "\\d"), df[ ,i], NA))}'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2021-11-01
    • 1970-01-01
    • 2018-01-22
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多