从字符转换为数字数据框

时间:2013-02-05 21:24:45

标签: r dataframe

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

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

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

2 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:7)

请注意,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 Grouping functions: 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

虽然:

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