Warm tip: This article is reproduced from serverfault.com, please click

其他-R扫描数据帧中的字符,但仅在参数列中

(其他 - R sweep a dataframe for characters, but only in the parameter columns)

发布于 2020-12-04 06:19:02

如果我有一个看起来像这样的.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       

我怎么会删除所有人物“细胞”和一个空值“”(NOT NULL)取代他们,只留下数字(和,重要的是,有NUM(或数字)类型的列,这样我可以阻止这样的错误Error in hist.default(testParam) : 'x' must be numeric在那里testParam是专栏之一?

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

Questioner
MrSwaggins
Viewed
0
det 2020-12-04 15:28:26

你可以尝试检测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列必须是字符而不是因素。如果它们是因素,则需要将它们转换为字符。