我在R中有一个字符数据帧,其中有NaN
s。我需要删除任何带有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
不是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分组函数: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