我需要一种方法来获得3个值的中值,我认为这是一个编写泛型方法的好机会,因为我没有真正实践过.我写了这个并且看起来非常直截了当,虽然我得到了警告,但根据我的测试,它似乎工作得很好.
我知道我可以使用固有排序的集合,或者Collections.sort(),但这种方法是为了理解.
我想指出一些事情:
medianHelper与Arrays.asList(a, b, c)这是为什么?试图搜索这个给我无关的结果,否则它是难以捉摸的,因为我不确定发生了什么.我得到了一个UnsupportedOperationException,但这不是我下面的方式.方法如下:
private static <T extends Comparable> T median(T a, T b, T c) {
List<T> medianHelper = new ArrayList<>();
T max;
T min;
medianHelper.add(a);
medianHelper.add(b);
medianHelper.add(c);
if (a.compareTo(b) >= 0) {
max = a;
min = b;
} else {
max = b;
min = a;
}
if (max.compareTo(c) == -1) {
max = c;
}
if (min.compareTo(c) >= 0) {
min = c;
} …Run Code Online (Sandbox Code Playgroud) 在这里,我创建一个新列,以指示myData是高于还是低于其中位数
### MedianSplits based on Whole Data
#create some test data
myDataFrame=data.frame(myData=runif(15),myFactor=rep(c("A","B","C"),5))
#create column showing median split
myBreaks= quantile(myDataFrame$myData,c(0,.5,1))
myDataFrame$MedianSplitWholeData = cut(
myDataFrame$myData,
breaks=myBreaks,
include.lowest=TRUE,
labels=c("Below","Above"))
#Check if it's correct
myDataFrame$AboveWholeMedian = myDataFrame$myData > median(myDataFrame$myData)
myDataFrame
Run Code Online (Sandbox Code Playgroud)
工作良好.现在我想做同样的事情,但计算myFactor每个级别的中位数分割.
我想出来了:
#Median splits within factor levels
byOutput=by(myDataFrame$myData,myDataFrame$myFactor, function (x) {
myBreaks= quantile(x,c(0,.5,1))
MedianSplitByGroup=cut(x,
breaks=myBreaks,
include.lowest=TRUE,
labels=c("Below","Above"))
MedianSplitByGroup
})
Run Code Online (Sandbox Code Playgroud)
byOutput包含我想要的东西.它正确地对因子A,B和C的每个元素进行分类.但是我想创建一个新列myDataFrame $ FactorLevelMedianSplit,它显示新计算的中值分割.
如何将"by"命令的输出转换为有用的数据框列?
我想也许"by"命令不是R-like方式来做这个...
更新:
有了Thierry如何巧妙地使用factor()的例子,并且在Spector的书中发现了"ave"函数,我发现了这个解决方案,它不需要额外的包.
myDataFrame$MediansByFactor=ave(
myDataFrame$myData,
myDataFrame$myFactor,
FUN=median)
myDataFrame$FactorLevelMedianSplit = factor(
myDataFrame$myData>myDataFrame$MediansByFactor,
levels = c(TRUE, FALSE),
labels = c("Above", "Below"))
Run Code Online (Sandbox Code Playgroud) 到目前为止,我的函数找到3个数字的中位数并对它们进行排序,但它总是进行三次比较.我想我可以在某处使用嵌套的if语句,这样有时我的函数只会进行两次比较.
int median_of_3(int list[], int p, int r)
{
int median = (p + r) / 2;
if(list[p] > list[r])
exchange(list, p, r);
if(list[p] > list[median])
exchange(list, p, median);
if(list[r] > list[median])
exchange(list, r, median);
comparisons+=3; // 3 comparisons for each call to median_of_3
return list[r];
}
Run Code Online (Sandbox Code Playgroud)
我不确定我在哪里可以看到嵌套的if语句.
我的数据集如下:
salary number
1500-1600 110
1600-1700 180
1700-1800 320
1800-1900 460
1900-2000 850
2000-2100 250
2100-2200 130
2200-2300 70
2300-2400 20
2400-2500 10
Run Code Online (Sandbox Code Playgroud)
如何计算此数据集的中位数?这是我尝试过的:
x <- c(110, 180, 320, 460, 850, 250, 130, 70, 20, 10)
colnames <- "numbers"
rownames <- c("[1500-1600]", "(1600-1700]", "(1700-1800]", "(1800-1900]",
"(1900-2000]", "(2000,2100]", "(2100-2200]", "(2200-2300]",
"(2300-2400]", "(2400-2500]")
y <- matrix(x, nrow=length(x), dimnames=list(rownames, colnames))
data.frame(y, "cumsum"=cumsum(y))
numbers cumsum
[1500-1600] 110 110
(1600-1700] 180 290
(1700-1800] 320 610
(1800-1900] 460 1070
(1900-2000] 850 1920
(2000,2100] 250 2170
(2100-2200] …Run Code Online (Sandbox Code Playgroud) 这个问题变成了问答,因为我很难找到答案,并认为它对其他人可能有用
我有一个值的JavaScript 数组,需要在JavaScript中计算其Q2(第50个百分数,即MEDIAN),Q1(第25个百分位数)和Q3(第75个百分位数)值。
对于一个映射,其中键表示一个序列的数量,并且值是计数这个数字在序列中出现的频率,java中的算法实现如何计算中值?
例如:
1,1,2,2,2,2,3,3,3,4,5,6,6,6,7,7
Run Code Online (Sandbox Code Playgroud)
在地图中:
Map<Int,Int> map = ...
map.put(1,2)
map.put(2,4)
map.put(3,3)
map.put(4,1)
map.put(5,1)
map.put(6,3)
map.put(7,2)
double median = calculateMedian(map);
print(median);
Run Code Online (Sandbox Code Playgroud)
会导致:
> print(median);
3
>
Run Code Online (Sandbox Code Playgroud)
所以我要找的是一个java实现calculateMedian.
我可以通过12次比较找到中位数.但我想知道比较的最小数量以及如何进行比较.
我有一个简单的numpy数组.
array([[10, 0, 10, 0],
[ 1, 1, 0, 0]
[ 9, 9, 9, 0]
[ 0, 10, 1, 0]])
Run Code Online (Sandbox Code Playgroud)
我想分别取这个数组的每列的中位数.
但是,0在计算中位数的过程中,我想忽略不同的几个值.
为了进一步复杂化,我想保留列只有0条目的中位数0.以这种方式,这些列将作为占位符的一部分,保持矩阵的尺寸相同.
numpy文档没有任何适用于我想要的参数(也许我被R获得的许多开关所破坏!)
numpy.median(a, axis=None, out=None, overwrite_input=False)[source]
有人可以请一个有效的方法来解决这个问题,这是否符合numpy的精神?我可能会破解它,但在那种情况下,我觉得我已经打败了首先使用numpy的目的.
提前致谢.
所以,我有一个相当大的数据集(Dropbox:csv文件),我正在尝试使用它geom_boxplot.以下产生了似乎合理的情节:
require(reshape2)
require(ggplot2)
require(scales)
require(grid)
require(gridExtra)
df <- read.csv("\\Downloads\\boxplot.csv", na.strings = "*")
df$year <- factor(df$year, levels = c(2010,2011,2012,2013,2014), labels = c(2010,2011,2012,2013,2014))
d <- ggplot(data = df, aes(x = year, y = value)) +
geom_boxplot(aes(fill = station)) +
facet_grid(station~.) +
scale_y_continuous(limits = c(0, 15)) +
theme(legend.position = "none"))
d
Run Code Online (Sandbox Code Playgroud)
然而,当你深入挖掘时,问题就会蔓延开来.当我用它们的值标记boxplot medians时,会产生以下图表.
df.m <- aggregate(value~year+station, data = df, FUN = function(x) median(x))
d <- d + geom_text(data = df.m, aes(x = year, y = value, label = value)) …Run Code Online (Sandbox Code Playgroud) 我需要将字段"步骤"中的缺失值替换为在特定日期(按"日期"分组)计算的"步数"的中位数,并删除NA值.我已经提到了这个帖子,但我的NA值没有被替换.有人可以帮我找出我错在哪里吗?我更喜欢使用base package/data table/plyr.数据集看起来很近.像这样:-
steps date interval
1: NA 2012-10-01 0
2: NA 2012-10-01 5
3: NA 2012-10-01 10
4: NA 2012-10-01 15
5: NA 2012-10-01 20
---
17564: NA 2012-11-30 2335
17565: NA 2012-11-30 2340
17566: NA 2012-11-30 2345
17567: NA 2012-11-30 2350
17568: NA 2012-11-30 2355
Run Code Online (Sandbox Code Playgroud)
数据集(活动)的结构和摘要如下所示
#str(activity)
Classes ‘data.table’ and 'data.frame': 17568 obs. of 3 variables:
$ steps : int NA NA NA NA NA NA NA NA NA NA ...
$ date : Date, format: …Run Code Online (Sandbox Code Playgroud)