我在 R 中有一个字符数据框,其中包含NaN
s。我需要用 a 删除任何行,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
or 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.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
调用包含在 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