从字符转换为数字数据框

17

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

如果我只对数据框执行as.numeric操作,则会遇到以下问题:

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

2
请查看complete.cases,并参见链接 - thijs van den bergh
2个回答

27

正如 @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选项实际上是将每个列向量转换为数字。


lapply(X = X, FUN = FUN, ...) 中出现错误: (从警告转换而来)强制转换引入了 NAs 1: as.data.frame(sapply(time, as.numeric)) 2: sapply(time, as.numeric) 3: lapply(X = X, FUN = FUN, ...) 4: .signalSimpleWarning("NAs introduced by coercion", quote(lapply(X = X, FUN = FUN, ...))) 5: withRestarts({ 6: withOneRestart(expr, restarts[[1]]) 7: doWithOneRestart(return(expr), restart) - ganesh reddy
不确定您的意思,您是指哪些sapply选项? - ganesh reddy
这两个解决方案都不起作用,我得到了相同的错误,也许我漏掉了什么? - ganesh reddy
就像我在评论中所说的那样,如果您提供一些示例数据,我们就可以找到问题的根源。 :) 请尝试发布 dput(yourdata) 的输出。 - user1317221_G
我会尝试理解大家的答案,我觉得我有点摸不着头脑,但应该能够自己解决 :) - ganesh reddy

10

请注意,data.frame 不是 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分组函数:sapply vs. lapply vs. apply. vs. tapply vs. by vs. aggregate)。

也就是说,在这种情况下,您可以对data.frame的每一列应用as.numeric函数,例如:

data.frame(lapply(dat,as.numeric))

为确保输出结果为data.frame而不是listlapply调用被包裹在一个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

3
好的回答。但R需要解决这个问题。像这样的事情会让人们远离我们的社区。 - MadmanLee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接