我想分配代表分位数的因子.因此我需要它们是数字.这就是我编写以下函数的原因,这基本上是我的问题的答案:
qdum <- function(v,q){
qd = quantile(v,1:(q)/q)
v = as.data.frame(v)
v$b = 0
names(v) <- c("a","b")
i=1
for (i in 1:q){
if(i == 1)
v$b[ v$a < qd[1]] = 1
else
v$b[v$a > qd[i-1] & v$a <= qd[i]] = i
}
all = list(qd,v)
return(all)
}
Run Code Online (Sandbox Code Playgroud)
你现在可能会笑:) 返回的列表包含一个变量,可用于将每个观察值分配给其对应的分位数.我现在的问题是:有更好的方法(更"本土"或"核心")吗?我知道quantcut(来自gtools包),但至少我得到的参数,我最终只有那些不方便(? - 至少对我来说)的阈值.
任何有助于变得更好的反馈都值得赞赏!
我编写了一个程序,用户可以在向量中输入任意数量的值,它应该返回四分位数,但我不断得到"向量下标超出范围"错误:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
#include <ios>
#include <vector>
int main () {
using namespace std;
cout << "Enter a list of numbers: ";
vector<double> quantile;
double x;
//invariant: homework contains all the homework grades so far
while (cin >> x)
quantile.push_back(x);
//check that the student entered some homework grades
//typedef vector<double>::size_type vec_sz;
int size = quantile.size();
if (size == 0) {
cout << endl << "You must enter your numbers . "
"Please …Run Code Online (Sandbox Code Playgroud) 我有一个data.table,并希望按组计算统计数据.
R) set.seed(1)
R) DT=data.table(a=rnorm(100),b=rnorm(100))
Run Code Online (Sandbox Code Playgroud)
这些群体应该由
R) quantile(DT$a,probs=seq(.1,.9,.1))
10% 20% 30% 40% 50% 60% 70% 80% 90%
-1.05265747329 -0.61386923071 -0.37534201964 -0.07670312896 0.11390916079 0.37707993057 0.58121734252 0.77125359976 1.18106507751
Run Code Online (Sandbox Code Playgroud)
我如何计算出每箱的平均值b,比如b=-.5我是否[-0.61386923071,-0.37534201964]在bin中3
主要问题:假设您有一个离散的有限数据集$ d $.然后命令摘要(d)返回Min,1st quartile,Median,mean,3rd quartile和max.我的问题是:R使用什么公式来计算第一个四分位数?
背景:我的数据集是:d=c(1,2,3,3,4,9).summary(d)返回2.25第一个四分位数.现在,计算第一个四分位数的一种方法是选择值q1,使得25%的数据集小于等于q1.显然,这不是R正在使用的.所以,我想知道,R使用什么公式来计算第一个四分位数?
谷歌搜索这个话题甚至更加困惑,我找不到R使用的公式.输入help(summary)R对我也没有帮助.
我有一个数据帧:
df = pd.DataFrame(np.random.randint(0,100,size=(5, 2)), columns=list('AB'))
A B
0 92 65
1 61 97
2 17 39
3 70 47
4 56 6
Run Code Online (Sandbox Code Playgroud)
这是5%的分位数:
down_quantiles = df.quantile(0.05)
A 24.8
B 12.6
Run Code Online (Sandbox Code Playgroud)
这里是低于分位数的值的掩码:
outliers_low = (df < down_quantiles)
A B
0 False False
1 False False
2 True False
3 False False
4 False True
Run Code Online (Sandbox Code Playgroud)
我想将df低于分位数的值设置为其列分位数.我可以这样做:
df[outliers_low] = np.nan
df.fillna(down_quantiles, inplace=True)
A B
0 92.0 65.0
1 61.0 97.0
2 24.8 39.0
3 70.0 47.0
4 56.0 12.6
Run Code Online (Sandbox Code Playgroud)
但肯定应该有一种更优雅的方式.我怎么能不这样做 …
我想为每个组进行分位数切割(切成n个具有相同点数的区间)
qcut = function(x, n) {
quantiles = seq(0, 1, length.out = n+1)
cutpoints = unname(quantile(x, quantiles, na.rm = TRUE))
cut(x, cutpoints, include.lowest = TRUE)
}
library(data.table)
dt = data.table(A = 1:10, B = c(1,1,1,1,1,2,2,2,2,2))
dt[, bin := qcut(A, 3)]
dt[, bin2 := qcut(A, 3), by = B]
dt
A B bin bin2
1: 1 1 [1,4] [6,7.33]
2: 2 1 [1,4] [6,7.33]
3: 3 1 [1,4] (7.33,8.67]
4: 4 1 [1,4] (8.67,10]
5: 5 1 (4,7] (8.67,10]
6: 6 …Run Code Online (Sandbox Code Playgroud) 我有数千个系列(DataFrame 的行)需要应用 qcut。定期会有一个系列(行)的值少于所需分位数(例如,1 个值与 2 个分位数):
>>> s = pd.Series([5, np.nan, np.nan])
Run Code Online (Sandbox Code Playgroud)
当我应用.quantile()它时,它可以毫无问题地分成两个分位数(具有相同的边界值)
>>> s.quantile([0.5, 1])
0.5 5.0
1.0 5.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)
但是,当我应用.qcut()整数值作为分位数时,会引发错误:
>>> pd.qcut(s, 2)
...
ValueError: Bin edges must be unique: array([ 5., 5., 5.]).
You can drop duplicate edges by setting the 'duplicates' kwarg
Run Code Online (Sandbox Code Playgroud)
即使我设置了duplicates参数,它仍然失败:
>>> pd.qcut(s, 2, duplicates='drop')
....
IndexError: index 0 is out of bounds for axis 0 with size 0
Run Code Online (Sandbox Code Playgroud)
我该如何进行这项工作?(同样,pd.qcut(s, [0, 0.5, 1], duplicates='drop')也不起作用。)
所需的输出是将分配 …
我正在寻找一种有效的分位数算法,该算法允许样本值随着时间的推移而“更新”或替换。
假设我有 items 的值1-n。我想将这些放入一个可以有效存储它们的分位数算法中。但是然后说在将来的某个时候, for 的值item-i会增加。我想删除原始值item-i并将其替换为更新后的值。特定用例适用于样本值随时间增加的流系统。
我见过的最接近这样的东西是t-Digest 数据结构。它有效地存储样本值。它唯一缺乏的是删除和替换样本值的能力。
我还查看了Apache Quantiles Datasketch - 它遇到了同样的问题 - 无法删除和替换样本。
编辑:更多地考虑这一点,不一定需要删除旧值并插入增加的值。如果存在只能更新值的约束,则可能有一种方法可以更轻松地重新计算内部状态。
在计算四分位数范围时,我遇到了一个有趣的情况.假设我们有一个数据帧,例如:
import pandas as pd
index=pd.date_range('2014 01 01',periods=10,freq='D')
data=pd.np.random.randint(0,100,(10,5))
data = pd.DataFrame(index=index,data=data)
data
Out[90]:
0 1 2 3 4
2014-01-01 33 31 82 3 26
2014-01-02 46 59 0 34 48
2014-01-03 71 2 56 67 54
2014-01-04 90 18 71 12 2
2014-01-05 71 53 5 56 65
2014-01-06 42 78 34 54 40
2014-01-07 80 5 76 12 90
2014-01-08 60 90 84 55 78
2014-01-09 33 11 66 90 8
2014-01-10 40 8 35 36 98
# …Run Code Online (Sandbox Code Playgroud) 当我在 R 中运行分位数回归时,使用quantreg包,然后运行summary(quantregObject),我收到此错误消息:
base::backsolve(r, x, k = k, upper.tri = upper.tri, transpose = transpose, : 'backsolve' 中的奇异矩阵中的错误。对角线 [1] 中的第一个零
任何建议我怎么能解决这个问题?
quantile ×10
r ×5
pandas ×3
data.table ×2
c++ ×1
data-science ×1
dataframe ×1
java ×1
nth-element ×1
package ×1
python ×1
python-2.7 ×1
quantreg ×1
regression ×1
sorting ×1
statistics ×1
vector ×1