- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 170 行带小数的数字,需要四舍五入为整数。但是,行总数必须等于我指定的数字。
作为一个非常基本的说明,假设我有一个矩阵 (1x4),其单元格内容为 (1.2、3.4、7.7、5.3)。但假设这些数字代表个体,因此我需要将它们四舍五入为整数,这样群体人口等于 18 个人的总人口。如果我简单地对矩阵内容进行舍入,得到 (1, 3, 8, 5),我的总人口是 17,我需要它等于 18(请参阅下面的 R 命令)。
m <- c(1.2, 3.4, 7.7, 5.3)
m.2 <- round(m)
m.2 [1] 1 3 8 5
sum(m.2) [1] 17
数字四舍五入后,我需要 R 选择下一个最接近四舍五入的数字(即 3.4)并将其四舍五入为 4 而不是 3。
这会给我一个矩阵 (1, 4, 8, 5) = 18。
博士。 John Fox 帮助我用一个简单的递归函数来解决这个问题:
Round <- function(x, target){
r.x <- round(x)
diff.x <- round(x) - x
if ((s <- sum(r.x)) == target) return(r.x)
else if (s > target) {
select <- seq(along=x)[diff.x > 0]
which <- which.max(diff.x[select])
x[select[which]] <- r.x[select[which]] - 1
Round(x, target)
}
else{
select <- seq(along=x)[diff.x < 0]
which <- which.min(diff.x[select])
x[select[which]] <- r.x[select[which]] + 1
Round(x, target)
}
}
这对于单独的行非常有用。但我的数据集中有 170 行。因此,这意味着重复这样的过程(见下文)170 次:
paste(STATA[['b']], collapse=", ")
B <- c(46.8310012817383, 19.9720001220703, 265.837005615234, 95.0400009155273, 6.88700008392334, 190.768997192383, 22.7269992828369, 764.453002929688, 53.0299987792969, 333.329010009766, 55.0960006713867, 84.0210037231445, 28.2369995117188, 2207.27099609375, 86.7760009765625, 50045.46875, 103.304000854492, 413.217987060547, 4.13199996948242, 2.75500011444092, 183.88200378418, 65.4260025024414, 0.689000010490417, 2248.59204101562, 0, 1.37699997425079, 16.5289993286133, 4.13199996948242, 4.13199996948242, 2.75500011444092, 4.13199996948242, 1.37699997425079, 0, 39.9440002441406, 2.75500011444092, 28.2369995117188, 0, 0, 5.51000022888184, 0, 48.8969993591309, 17.9060001373291, 485.531005859375, 1.37699997425079, 59.9169998168945, 221.759994506836, 28.2369995117188, 4.13199996948242, 65.4260025024414, 11.0190000534058, 38.5670013427734, 3.44300007820129, 8.95300006866455, 2.75500011444092, 23.4160003662109, 4.13199996948242, 50.5750015258789, 11.7080001831055, 19.2830009460449, 48.8969993591309, 0, 13.7740001678467, 92.9739990234375)
varB <- (Round(B, 58701))
ROUND2012$varB <- varB
^在本例中,我在 Excel 中使用了数据集的转置,因为我发现与附加行相比,在 R 中将列附加到数据集更容易。但理想情况下,我不必这样做,行将是我的领土,列是群体身份人口数据。这里,“b”是我调用的列的名称,58701 是这些数字在四舍五入后需要相加的人口总数。
简而言之,我正在寻找一个对整个数据集而不是单个行有帮助的函数。理想情况下,我能够调用包含要舍入的数字的列,以及调用包含我需要舍入的数字等于的人口总数的列。
更新信息
作为一个更具说明性的示例。假设我的人口中有两个种族群体。
B
race1 race2 total
place1 1.2 2.1 3.4
place2 3.4 3.6 7.0
place3 7.7 0.8 8.5
place4 5.3 1.4 6.7
我需要这些数字等于我的登记选民总数。总计为 3.4、7.0、8.5、6.7,但我需要对每个位置行中的内容进行四舍五入,以便我的位置 (1-4) 总计为 4.0、7.0、8.0 和 7.0。这意味着对于 place1,我需要对内容进行四舍五入,以便 1.2 变为 2.0,2.1 变为 2.0。我的登记选民人数等于 4.0。对于第二名,总数已经是 7,所以我们没问题。对于 place3,7.7 将变为 7.0,0.8 将变为 1,总共为 8。最后,对于 place4,我需要 5.3 舍入为 5,1.4 舍入为 2.0,总共为 7。我想要的是:
B
race1 race2 total
place1 2.0 2.0 4.0
place2 3.0 4.0 7.0
place3 7.0 1.0 8.0
place4 5.0 2.0 7.0
目前,上面粘贴的舍入函数允许我一次调用一系列数字,并手动输入需要舍入的总数。但我正在寻找一个可以同时完成这一切的功能。我想将所有种族列称为四舍五入,并调用包含所有必要人口总数的列。(注意:实际上,我在 excel 中对矩阵进行了转置,并将其重新导入到 R 中,因为作为一个相当新的 R 用户,我发现将新列附加到数据集比附加新行更容易。但是我绝对不需要执行该步骤,而且实际上也不想这样做。)
最佳答案
有几种方法可以做到这一点,但请采纳我上面的评论:
Round <- function(x, target) {
r.x <- round(x)
diff.x <- round(x) - x
if ((s <- sum(r.x)) == target) {
return(r.x)
} else if (s > target) {
select <- seq(along=x)[diff.x > 0]
which <- which.max(diff.x[select])
x[select[which]] <- r.x[select[which]] - 1
Round(x, target)
} else {
select <- seq(along=x)[diff.x < 0]
which <- which.min(diff.x[select])
x[select[which]] <- r.x[select[which]] + 1
Round(x, target)
}
}
dat <- read.table(header = TRUE, row.names = paste0('place', 1:4),
text="race1 race2 total
1.2 2.1 3.4
3.4 3.6 7.0
7.7 0.8 8.5
5.3 1.4 6.7")
totals <- c(4.0, 7.0, 8.0, 7.0)
这两个示例只是执行 Round
在每一行上使用 dat
的两列的 1-1 映射与 totals
中的每个对应值
lapply
返回一个列表,因此要将输出转换回矩阵/数据帧,我们 rbind
一切都回到了一起。
do.call(rbind, lapply(1:nrow(dat), function(x) Round(dat[x, -3], totals[x])))
# race1 race2
# place1 2 2
# place2 3 4
# place3 7 1
# place4 5 2
apply
的输出转换为你想要的,所以我们 t
结果
dat[3] <- totals
t(apply(dat, 1, function(x) Round(x[1:2], x[3])))
# race1 race2
# place1 2 2
# place2 3 4
# place3 7 1
# place4 5 2
或者,您可能可以使用Map
想出更聪明的东西。/mapply
或Vectorize
Round
以避免这些循环,但您的数据似乎不是很大。
关于R:对每行内的内容进行四舍五入,使行总计等于我指定的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25829504/
我有这个“科学应用程序”,其中 Single 值在显示在 UI 中之前应该四舍五入。根据this MSDN article ,由于“精度损失”,Math.Round(Double, Int32) 方法
这个问题类似于Chrome 37 calc rounding 但实际问题有点复杂,提供的解决方案不适用于这种情况: #outerDiv, #leftDiv, #middleDiv, #rightDiv
假设有一堆从 pnorm() 返回的数据,这样您就有了 .0003ish 和 .9999ish 之间的数字。 numbers <- round(rnorm(n = 10000, mean =
我想有效地将unsigneda整数除以2的任意幂,然后取整。所以我在数学上想要的是ceiling(p/q)0。在C语言中,不利用q受限域的Strawman实现可能类似于以下function1: /
我正在尝试获取 #value_box 的值以显示 100.5 但它一直在向上舍入。有谁知道我可以做些什么来让它显示小数位? jsfiddle //returns 101 $("#value_box
我有一段 JavaScript 代码 shipingcostnumber * parseInt(tax) / 100 + shipingcostnumber 返回数字为6655.866558,因此我将
我有一个关于 PostgreSQL 9.2 中 float 的新手问题。 是否有直接舍入 float 的函数,即不必先将数字转换为数字类型? 另外,我想知道是否有一个函数可以按任意度量单位舍入,例如最
这个问题已经有答案了: Rounding to nearest 100 (7 个回答) 已关闭10 年前。 我正在尝试将数字四舍五入到 100。 示例: 1340 should become 1400
我试图找出使用整数存储在列表中的其他两个数字之间的任何n在整数列表中找到最接近的值ROUNDED DOWN的最佳方法。在这种情况下,所有整数都将始终是无符号的,以防万一。 假设如下: 列表始终从0开始
我想将一个 BigDecimal 四舍五入到小数点后两位,但是当使用 round 方法时,它似乎没有双舍入: BigDecimal.new('43382.0249').round(2).to_s('F
我正在使用格式如下的财务数据进行计算: . 基本上,在我的程序中我遇到了一个浮点错误。例如,如果我有: 11.09 - (11.09 * 0.005) = 11.03455 我希望能够使用 11.03
有整型变量,电压单位为毫伏。 signed int voltage_mv = 134; //134mV 我有 2 段显示,我想显示百分之一伏特。 如何在一次操作中将毫伏转换为百分之一伏?没有 IF 语
这是我将数字四舍五入到两位小数的函数,但是当四舍五入的数字为 1.50 时,它似乎忽略尾随零并只返回 1.5 public static double roundOff(double number)
您好,我在将数字四舍五入到 -0 而不是 0 时遇到了问题 代码: 输出:-0 预期输出:0 我一直在寻找任何解决方案,但没有找到。 请解释并帮助我为什么它四舍五入为 -0 而不是 0?谢谢 最佳答
我正在使用 Java 的 Random 生成随机数:1.0、1.1 - 10 Random random = new Random(); return (double) ((random.nextIn
基本上,我有一个数字: 我基本上想做一些数学运算来创建这个数字 80。 如果数字是 62.7777777778,则数字将为 60。 我希望数字像这样四舍五入: 20, 40, 60, 80, 100
我希望显示来自 NSDate 对象的月数。 //Make Date Six Months In The Future NSCalendar *calendar = [[NSCalendar alloc
下面是一些小代码来说明我所看到的 float floater = 59.999f; DecimalFormat df = new DecimalFormat("00.0"); System.out.p
我现在开始使用 android 和 java,但遇到了问题。 I have a result x = 206.0548. And y = 206, both of type double How do
我有一个 ruby 散列数组,其中包含两个键,'tier' 和 'price'。对于给定的价格,我想退回等级。 这对于精确匹配来说已经足够简单了,但是我如何通过将我的输入值四舍五入到数组中的下一个
我是一名优秀的程序员,十分优秀!