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

ztl*_*ztl 3 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
Run Code Online (Sandbox Code Playgroud)

在这个例子中,人们可以在例如第2行看到cut功能正确(即,值0.3被正确地用作切割点bmid而不是0.5第一行),但结果标签是错误的(即(0.5, 1]实际上不包含该值0.4098122并且0.5是确实不是切入点).

grp2是尝试手动设置标签,也是失败,这意味着手动相关的breaks解决方案grp3似乎是唯一的前进方式......

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

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

MrF*_*ick 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
Run Code Online (Sandbox Code Playgroud)

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

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