14

我在 R 中有一个字符数据框,其中包含NaNs。我需要用 a 删除任何行,NaN然后将其转换为数字数据框。

如果我只是在数据框上执行 as.numeric,我会遇到以下情况

Error: (list) object cannot be coerced to type 'double'
 1:
 0:
4

2 回答 2

22

正如@thijs van den bergh 指出的那样,

dat <- data.frame(x=c("NaN","2"),y=c("NaN","3"),stringsAsFactors=FALSE)

dat <- as.data.frame(sapply(dat, as.numeric)) #<- sapply is here

dat[complete.cases(dat), ]
#  x y
#2 2 3

一种方法来做到这一点。

您的错误来自尝试制作data.frame数字。我展示的sapply选项是使每个列向量变为数字。

于 2013-02-05T21:34:51.500 回答
9

请注意,data.frames不是numericor character,而是 a list,它可以是所有numeric列、所有character列或这些或其他类型的混合(例如:Date/ logical)。

dat <- data.frame(x=c("NaN","2"),y=c("NaN","3"),stringsAsFactors=FALSE)
is.list(dat)
# [1] TRUE

示例数据只有两个字符列:

> str(dat)
'data.frame':   2 obs. of  2 variables:
 $ x: chr  "NaN" "2"
 $ y: chr  "NaN" "3

...您可以添加一个数字列,如下所示:

> dat$num.example <- c(6.2,3.8)
> dat
    x   y num.example
1 NaN NaN         6.2
2   2   3         3.8
> str(dat)
'data.frame':   2 obs. of  3 variables:
 $ x          : chr  "NaN" "2"
 $ y          : chr  "NaN" "3"
 $ num.example: num  6.2 3.8

因此,当您尝试执行as.numericR 时会感到困惑,因为它想知道如何转换这个可能有多种类型的列表对象。user1317221_G的答案使用?sapply函数,该函数可用于将函数应用于对象的各个项目。您也可以使用?lapply非常相似的函数(在*apply此处阅读有关函数的更多信息 - R 分组函数:sapply vs. lapply vs. apply. vs. tapply vs. by vs. aggregate

即 - 在这种情况下,您的每一列data.frame,您可以应用该as.numeric功能,如下所示:

data.frame(lapply(dat,as.numeric))

lapply调用包含在 a中data.frame以确保输出是 adata.frame而不是 a list。也就是说,运行:

lapply(dat,as.numeric)

会给你:

> lapply(dat,as.numeric)
$x
[1] NaN   2

$y
[1] NaN   3

$num.example
[1] 6.2 3.8

尽管:

data.frame(lapply(dat,as.numeric))

会给你:

>  data.frame(lapply(dat,as.numeric))
    x   y num.example
1 NaN NaN         6.2
2   2   3         3.8
于 2013-02-05T22:01:31.947 回答