如果我有一个看起来像这样的.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
,但是在它们仅影响参数列以及可以从中插入任何可能的字符/字符串的地方,我似乎都无法使它们中的任何一个都起作用。各种参数生成器。
你可以尝试检测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
列必须是字符而不是因素。如果它们是因素,则需要将它们转换为字符。
我在一个循环中一次测试参数列的循环中使用它,因此在的指导下
ifelse
,str_detect
我开始使用此方法:if(is.character(df[ ,i])){testing <- as.numeric(ifelse(str_detect(df[ ,i], "\\d"), df[ ,i], NA))}'