我在R中有一个字符数据框,其中包含NaN
个。我需要删除NaN
的任何行,然后将其转换为数字数据框。
如果我只是在数据框上执行as.numeric,我会遇到以下
Error: (list) object cannot be coerced to type 'double'
1:
0:
答案 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
不是numeric
或character
,而是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