在R和使用dplyr时,我需要在一个列中使用非常量(而不是唯一) 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-independent解决方案(如grp3 )似乎是前进的唯一途径。
总之,rowwise似乎不适用于标签,但很好地适用于切点.
我有遗漏什么吗,还是这是一种错误的行为?我如何在逐行的基础上标注我的间隔时间?
发布于 2015-11-26 15:07:54
问题是,您正在尝试构建一个因子列,其中每一行都有不同的级别/标签。这在各种因素中是不可能的。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))))https://stackoverflow.com/questions/33941510
复制相似问题