从字符转换为数字数据框

gan*_*ddy 9 r dataframe

我在R中有一个字符数据框,里面有NaNs.我需要删除任何行,NaN然后将其转换为数字数据框.

如果我只是在数据框上执行as.numeric,我会遇到以下情况

Error: (list) object cannot be coerced to type 'double'
 1:
 0:
Run Code Online (Sandbox Code Playgroud)

use*_*1_G 16

正如@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
Run Code Online (Sandbox Code Playgroud)

一种方法来做到这一点.

您的错误来自于尝试制作data.frame数字.sapply我展示的选项是将每列向量数字化.


the*_*ail 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
Run Code Online (Sandbox Code Playgroud)

示例数据只有两个字符列:

> str(dat)
'data.frame':   2 obs. of  2 variables:
 $ x: chr  "NaN" "2"
 $ y: chr  "NaN" "3
Run Code Online (Sandbox Code Playgroud)

...你可以添加一个数字列,如下所示:

> 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
Run Code Online (Sandbox Code Playgroud)

所以,当你尝试做as.numericR时会感到困惑,因为它想知道如何转换这个可能有多种类型的列表对象.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))
Run Code Online (Sandbox Code Playgroud)

lapply呼叫被包裹在data.frame确保输出的是data.frame与不是list.也就是说,运行:

lapply(dat,as.numeric)
Run Code Online (Sandbox Code Playgroud)

会给你:

> lapply(dat,as.numeric)
$x
[1] NaN   2

$y
[1] NaN   3

$num.example
[1] 6.2 3.8
Run Code Online (Sandbox Code Playgroud)

而:

data.frame(lapply(dat,as.numeric))
Run Code Online (Sandbox Code Playgroud)

会给你:

>  data.frame(lapply(dat,as.numeric))
    x   y num.example
1 NaN NaN         6.2
2   2   3         3.8
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案。但是 R 需要解决这个问题。像这样的事情让人们远离我们的社区。 (2认同)