繁体   English   中英

如何确定R中数据的有效数字?

[英]How do I determine the number of significant figures in data in R?

我有一个大型数据集,我在R中分析,我对一列或信息矢量感兴趣。 此向量中的每个条目都有不同数字(范围从1-5)的有效数字,我想要对此向量进行子集化,因此我没有看到只有一个有效数字的数据。 我可以使用什么样的测试或功能来报告每个条目的重要数字? 我查看了signif()函数,但更多的是将数据舍入到指定数量的有效数字,而不是查询有多少sig figs。

示例:假设我有这个向量:
4
28.382
120
82.3
100
30.0003

我想删除只有一个有效数字的条目。 这将是条目1(值为4)和条目5(值为100)。 我知道如何在R中对数据进行子集化,但我不知道如何告诉R只用一个有效数字“找到”所有值。

x <- c(4, 28.382, 120, 82.3, 100, 30.0003)
#compare the values with result of signif
#you need to consider floating point precision
keep <- abs(signif(x, 1) - x) > .Machine$double.eps
x[keep]
#[1]  28.3820 120.0000  82.3000  30.0003

我认为这应该等同于Rolands解决方案。

x <- c(4, 4.0, 4.00, 28.382, 120,
       82.3, 100, 100.0, 30.0003)
x
ifelse(x == signif(x, 1), NA, x)
ifelse(x == signif(x, 2), NA, x)
ifelse(x == signif(x, 3), NA, x)

在任何情况下,对于诸如“4.00”和“100.0”之类的情况给出不正确的有效位数,它至少具有相同的问题。

如上所述,解决方案部分地将数字视为字符串。 简单地将数字转换为字符是不够的,它们必须被读入,这需要一些小心。 read.table函数组中的colClasses参数可以派上用场

xc <- c("4", "4.0", "4.00", "28.382", "120",
        "82.3", "100", "100.0", "30.0003")
xc
# "4"  "4.0" "4.00" "28.382" "120" "82.3" "100" "100.0" "30.0003"
ifelse(xc == signif(as.numeric(xc), 1), NA, xc)
# "NA" "4.0" "4.00" "28.382" "120" "82.3" "NA"  "100.0" "30.0003"

仅删除“4”和“100”。 这看起来很有希望,但如果我们再往前走一点,我们就会看到并非一切都如此应有。

ifelse(xc == signif(as.numeric(xc), 2), NA, xc)
# "NA" "4.0" "4.00" "28.382" "120" "82.3" "NA"  "100.0" "30.0003"
ifelse(xc == signif(as.numeric(xc), 3), NA, xc)
# "NA" "4.0" "4.00" "28.382" "120" "82.3" "NA"  "100.0" "30.0003"

原因可以这样说明

2 == "2"
# TRUE – only what's between the quotes is compared
2.0 == "2"; 02 == "2"
# TRUE
# TRUE – R removes what's considered numerically empty characters
2 == "2.0"
# FALSE – strings aren't modified.
2 == as.numeric("2.0")
# TRUE – that is, unless you explicitly request it.

还值得记住的是,字符串的比较基于字母数字顺序,即使字符串很容易被解释为数字。

2 < "2.0"
# TRUE
2 > "2.0"
# FALSE
"2.0" < "2.00"
# TRUE
sort(xc)
# "100" "100.0" "120" "28.382" "30.0003" "4" "4.0" "4.00" "82.3" 

到目前为止,我发现这个问题的唯一完整修复是有点hacky。 它包括分离出包含小数分隔符(“。”)的字符串,并用“1”(或任何非零数字)替换这些字符串的最后一个字符。 因此将“4.0”变为“4.1”,但保持“100”原样。 然后将该新矢量用作比较的基础。

xc.1 <- xc
decimal <- grep(".", xc, fixed=TRUE)
xc.1[decimal] <- gsub(".$", "1", xc[decimal])
xc.1 <- as.numeric(xc.1)

xc
# "4"  "4.0" "4.00" "28.382" "120" "82.3" "100" "100.0" "30.0003"
ifelse(xc.1 == signif(xc.1, 1), NA, xc)
# "NA" "4.0" "4.00" "28.382" "120" "82.3" "NA"  "100.0" "30.0003"
ifelse(xc.1 == signif(xc.1, 2), NA, xc)
# "NA" "NA"  "4.00" "28.382" "NA"  "82.3" "NA"  "100.0" "30.0003"
ifelse(xc.1 == signif(xc.1, 3), NA, xc)
# "NA" "NA"  "NA"   "28.382" "NA"  "NA"   "NA"  "100.0" "30.0003"

如果您想实际计算有效位数,可以使用小循环来完成。

n <- 7

# true counts
xc.count <- vector(length=length(xc.1))
for (i in n:1) xc.count[xc.1 == signif(xc.1, i)] <- i
xc.count
# 1 2 3 5 2 3 1 4 6

# simple counts
x.count <- vector(length=length(x))
for (i in n:1) x.count[x == signif(x, i)] <- i
x.count
# 1 1 1 5 2 3 1 1 6

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM