【问题标题】:Converting from a character to a numeric data frame从字符转换为数字数据框
【发布时间】:2013-02-05 21:24:45
【问题描述】:

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

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

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

【问题讨论】:

  • 看看complete.cases,也看看link

标签: r dataframe


【解决方案1】:

正如@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,...):(从警告转换)强制 1 引入的 NA:as.data.frame(sapply(time, as.numeric) ) 2: sapply(time, as.numeric) 3: lapply(X = X, FUN = FUN, ...) 4: .signalSimpleWarning("强制引入的NAs", quote(lapply(X = X, FUN = FUN , ...))) 5: withRestarts({ 6: withOneRestart(expr, restarts[[1]]) 7: doWithOneRestart(return(expr), restart)
  • 不确定您的意思,哪些选项适用?
  • 两种解决方案都不起作用,我遇到同样的错误,也许我遗漏了什么?
  • 就像我在评论中所说的那样,如果您提供一些示例数据,我们可以深入了解这一点。 :) 尝试发布dput(yourdata)的输出
  • 我会尝试理解答案,伙计们,我想我是在摸索,但应该能够帮助自己:)
【解决方案2】:

请注意,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 Grouping functions: 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

同时:

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

【讨论】:

  • 很好的答案。但是 R 需要解决这个问题。正是这样的事情让人们远离了我们的社区。​​span>
猜你喜欢
  • 2023-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 2020-10-28
相关资源
最近更新 更多