我有一个R中的字符数据框,其中包含NaN
。我需要删除任何包含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
选项实际上是将每个列向量转换为数字。
dput(yourdata)
的输出。 - user1317221_G请注意,data.frame
不是 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))
为确保输出结果为data.frame
而不是list
,lapply
调用被包裹在一个data.frame
中。
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
complete.cases
,并参见链接。 - thijs van den bergh