当中断不唯一时将列中的值分配给十分位数
Assigning values in a column to deciles when breaks are not unique
假设我有一个包含 1000 个数字的向量。我想获得这个向量的十分位数,然后找到每个十分位数的平均值。但是,此向量中有 215 个以上的零。这意味着第一次和第二次中断将为零,因此我将 运行 变为 Cut() error - 'breaks' are not unique
错误。我想要的是将 100 个零分配给第一个十分位数,另外 100 个零分配给第二个十分位数,最后 15 个零分配给第三个十分位数。这样第一和第二个十分位数的平均值将为零。这是一个具有类似问题的可重现且较小的示例:
v=c(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 5, 6, 3, 7)
cut_q10 <- quantile(v, probs = seq(0, 1, 0.1))
v_q10 =cut(v, breaks = cut_q10,labels = FALSE)
#Error in cut.default(v, breaks = cut_q10, labels = FALSE) :
# 'breaks' are not unique
我想获得的是:
v_q10 = c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,10,9,10)
或
v_q10 = c(2,2,1,1,3,4,4,3,5,5,6,6,7,7,8,8,9,10,9,10)
等...
只要第一个十分位有两个0,第二个有两个0,第三个有两个1,第四个有两个1等等,所有这些都是可以接受的,这样无论获得哪个v_q10
当我找到每个十分位数的均值时,我得到了这个:
merged = as.data.frame(cbind(v,v_q10))
merged = merged%>%group_by(v_q10)%>%summarise(means = mean(v))
v_q10 means
# <dbl> <dbl>
# 1 1 0
# 2 2 0
# 3 3 1
# 4 4 1
# 5 5 1
# 6 6 2
# 7 7 2
# 8 8 3
# 9 9 4
#10 10 6.5
我知道可以通过编写很长的代码来实现这一点,但我想知道是否有一个函数或几行代码可以实现这一点。
提前致谢。
试试这个:
cut(rank(v, ties = "first"), 10, lab = FALSE)
## [1] 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 10 9 10
备选方案包括使用 ties = "last"
或使用 ties = "random"
或使用 order(order(v))
代替 rank(...)
。
假设我有一个包含 1000 个数字的向量。我想获得这个向量的十分位数,然后找到每个十分位数的平均值。但是,此向量中有 215 个以上的零。这意味着第一次和第二次中断将为零,因此我将 运行 变为 Cut() error - 'breaks' are not unique
错误。我想要的是将 100 个零分配给第一个十分位数,另外 100 个零分配给第二个十分位数,最后 15 个零分配给第三个十分位数。这样第一和第二个十分位数的平均值将为零。这是一个具有类似问题的可重现且较小的示例:
v=c(0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 5, 6, 3, 7)
cut_q10 <- quantile(v, probs = seq(0, 1, 0.1))
v_q10 =cut(v, breaks = cut_q10,labels = FALSE)
#Error in cut.default(v, breaks = cut_q10, labels = FALSE) :
# 'breaks' are not unique
我想获得的是:
v_q10 = c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,10,9,10)
或
v_q10 = c(2,2,1,1,3,4,4,3,5,5,6,6,7,7,8,8,9,10,9,10)
等...
只要第一个十分位有两个0,第二个有两个0,第三个有两个1,第四个有两个1等等,所有这些都是可以接受的,这样无论获得哪个v_q10
当我找到每个十分位数的均值时,我得到了这个:
merged = as.data.frame(cbind(v,v_q10))
merged = merged%>%group_by(v_q10)%>%summarise(means = mean(v))
v_q10 means
# <dbl> <dbl>
# 1 1 0
# 2 2 0
# 3 3 1
# 4 4 1
# 5 5 1
# 6 6 2
# 7 7 2
# 8 8 3
# 9 9 4
#10 10 6.5
我知道可以通过编写很长的代码来实现这一点,但我想知道是否有一个函数或几行代码可以实现这一点。 提前致谢。
试试这个:
cut(rank(v, ties = "first"), 10, lab = FALSE)
## [1] 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 10 9 10
备选方案包括使用 ties = "last"
或使用 ties = "random"
或使用 order(order(v))
代替 rank(...)
。