r-从字符转换为数字数据帧



我在R中有一个字符数据帧,其中有NaNs。我需要删除任何带有NaN的行,然后将其转换为数字数据帧。

如果我只是在数据帧上做as.numeric,我会遇到以下

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

正如@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选项是将每列向量设为数字。

请注意,data.frames不是numericcharacter,而是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.numeric时,R会感到困惑,因为它想知道如何转换这个可能有多种类型的列表对象。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调用被封装在data.frame中,以确保输出是data.frame而不是list。也就是说,运行:

lapply(dat,as.numeric)

会给你:

> lapply(dat,as.numeric)
$x
[1] NaN   2
$y
[1] NaN   3
$num.example
[1] 6.2 3.8

While:

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

最新更新