gpt4 book ai didi

r - 从文本到数字的转换可能不一致

转载 作者:行者123 更新时间:2023-12-04 19:06:00 24 4
gpt4 key购买 nike

比较字符串的转换与as.numeric了解如何使用 read.fwf 完成此操作.

as.numeric("457")  # 457
as.numeric("4 57") # NA with warning message

现在从文件 "fwf.txt"中读取正好包含 "5 7 12 4"。
foo<-read.fwf('fwf.txt',widths=c(5,5),colClasses='numeric',header=FALSE)
V1 V2
1 57 124

foo<-read.fwf('fwf.txt',widths=c(5,5),colClasses='character',header=FALSE)
V1 V2
1 5 7 12 4

现在,我会注意到在“数字”版本中, read.fwf以与 Fortran 相同的方式进行连接。我只是有点惊讶它没有抛出错误或 NA以与 as.numeric 相同的方式.有谁知道为什么?

最佳答案

正如@eipi10 所指出的,空间消除行为并不是read.fwf 独有的。 .它实际上来自 scan()函数(由 read.table 使用,由 read.fwf 使用)。实际上, scan() 函数会在处理输入流时从任何不是字符的值中删除空格(或制表符,如果它们未指定为分隔符)。一旦它“清除”了空格的值,它就会使用与 as.numeric 相同的函数。将该值转换为数字。除非您设置 strip.white=TRUE,否则字符值不会去除任何空格。这只会从值的开头和结尾删除空格。

观察这些例子

scan(text="TRU E", what=logical(), sep="x")
# [1] TRUE
scan(text="0 . 0 0 7", what=numeric(), sep="x")
# [1] 0.007
scan(text=" text ", what=character(), sep="~")
# [1] " text "
scan(text=" text book ", what=character(), sep="~", strip.white=T)
# [1] "text book"
scan(text="F\tALS\tE", what=logical(), sep=" ")
# [1] FALSE

您可以找到 scan() 的来源在 /src/main/scan.c对此行为负责的具体部分是 around this line .

如果您需要 as.numeric为了表现得像,您可以创建一个新功能,例如
As.Numeric<-function(x) as.numeric(gsub(" ", "", x, fixed=T))

为了得到
As.Numeric("4 57")
# [1] 457

关于r - 从文本到数字的转换可能不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24438022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com