在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似乎并不适用于标签,但很好地适用于切割点......
我错过了什么,或者这是一个错误的行为?如何在行上标记我的间隔?
问题是您正在尝试构建一个因子列,其中每行具有不同的级别/标签.这种情况不太可能.在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)
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |