【问题标题】:Data frame typecasting entire column to character from numeric将整列从数字转换为字符的数据框
【发布时间】:2012-12-03 05:36:49
【问题描述】:

假设我有一个data.frame,它完全是numeric。如果我将第一列的一个条目设为character(例如),那么整个第一列将变为character

问题:我该如何扭转这种情况。也就是说,我如何使data.frame 中的任何character 对象“显然”为numeric 对象被强制为numeric

MWE:

test <- data.frame(matrix(rnorm(50),10))
is(test[3,1])
test[1,1] <- "TEST"
is(test[3,1])
print(test)

因此,我的目标是从 test 现在的状态转变为 test[2:10]numeric 的状态。所以我想我要的是一个在整个data.frame 上执行此操作的函数。

【问题讨论】:

  • R 数据框中的一列只能有一种类型,因此如果您将一个字符串放入“TEST”之类的字符串,它会强制将整个列更改为一个字符串。您可以使用test$X1 &lt;- as.numeric(test$X1),但请注意,由于“TEST”不是“明显数字”,它将被转换为NA。否则,您可以在将它们分配给数据框之前确保它们是数字的:test[1, 1] &lt;- as.numeric("TEST")

标签: r casting dataframe numeric


【解决方案1】:

简短的回答是你不能。
正如 cmets 中提到的,在数据​​框中,列的所有元素必须具有相同的模式。

如果您想专门查找“类似数字”的值,您可以使用以下内容(这里的 vec 可以是数据框列)

  vec[!is.na(as.numeric((vec)))]

然后您可以转换这些值,但遗憾的是您不能将转换后的值放回同一列。和你一样,他们会被强制回character



至于可以将整个数据帧转换为数字的函数(意识到不可能将特定条目隔离为异常),您可以使用sapply

  sapply(dataFrameName, as.numeric)

【讨论】:

  • 或者我们可以使用data.matrix(...)
  • 当然,但是如果您的列看起来像数字但实际上是因子,data.matrix 可能会产生意想不到的结果
【解决方案2】:

您可以在 data.frame 中拥有 list 类型的向量,并且列表可以包含除函数之外的任何类型的对象,只要它与 data.frame 中的其他列的长度相同,例如:

mydataframe <- data.frame(numbers=1:3)
mydataframe$mylist <- list(1, 'plum', 5)
mydataframe
#  numbers mylist
#1       1      1
#2       2   plum
#3       3      5
sapply(mydataframe, typeof)
#  numbers    mylist 
#"integer"    "list" 
sapply(mydataframe$mylist, typeof)
#[1] "double"    "character" "double"  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-09
    • 2018-01-18
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2017-12-19
    相关资源
    最近更新 更多