使用`dplyr :: rowwise`剪切`cut`的标签行为错误?

时间:2015-11-26 14:50:28

标签: r dplyr

R并使用dplyr,我需要使用非常量(非唯一)cut在一列中breaks值,这些值是针对每个值定义的行,由同一数据帧的其他列中的值。因此我使用rowwise。虽然breaks似乎在功能上有效(即每行更新),但labels似乎并不一致。

例如:

library(dplyr)
set.seed(10)
myDF = data.frame(a=runif(5, min=0.3, max=0.7), 
                  bmin = rep(0, 5), 
                  bmid = c(0.5, 0.3, 0.6, 0.7, 0.4),
                  bmax = rep(1, 5))

myDF %>% rowwise() %>% mutate(grp1 = cut(a, breaks=c(bmin, bmid, bmax)),
                              grp2 = cut(a, breaks=c(bmin, bmid, bmax), 
                                         labels=c(paste(bmin, bmid, sep='-'),
                                                  paste(bmid, bmax, sep='-'))),
                              grp3 = cut(a, breaks=c(bmin, bmid, bmax), 
                                         labels=c(1, 2)))

#           a  bmin  bmid  bmax    grp1   grp2   grp3
#       (dbl) (dbl) (dbl) (dbl)  (fctr) (fctr) (fctr)
# 1 0.3901746     0   0.5     1 (0,0.5]  0-0.5      1
# 2 0.4098122     0   0.3     1 (0.5,1]  0.5-1      2
# 3 0.4089220     0   0.6     1 (0,0.5]  0-0.5      1
# 4 0.5463317     0   0.7     1 (0,0.5]  0-0.5      1
# 5 0.4718686     0   0.4     1 (0.5,1]  0.5-1      2

在这个例子中,人们可以看到例如在第2行,cut在功能上是正确的(即,值0.3已正确用作切割点bmid,而不是第一行的0.5,但生成的标签是错误的(即(0.5, 1]确实不包含值0.4098122,而0.5确实不是切入点。

grp2尝试手动设置标签,也失败了,这意味着breaks中的手动grp3独立解决方案似乎是前进的唯一方法...... < / p>

简而言之,rowwise似乎不适用于标签,但适用于切割点......

我错过了什么,或者这是一种错误的行为? 如何按行标记我的间隔?

1 个答案:

答案 0 :(得分:6)

问题是您正在尝试构建一个因子列,其中每行具有不同的级别/标签。这种情况不太可能。 mutate似乎正试图协调所有因素标签,这会产生这种奇怪的效果。它并非cut()所独有,另见

data.frame(z=c("a","b","c")) %>% rowwise() %>% mutate(g=factor(z))
#        z      g
#   (fctr) (fctr)
# 1      a      a
# 2      b      a
# 3      c      a

一种解决方法是返回字符值而不是因子值。

myDF %>% rowwise() %>% mutate(grp1 = as.character(cut(a, breaks=c(bmin, bmid, bmax))))