在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
似乎不适用于标签,但适用于切割点......
我错过了什么,或者这是一种错误的行为? 如何按行标记我的间隔?
答案 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))))