在R.条件下循环通过data.table进行比较的问题没有改变
我在数据表中创建分类变量时遇到问题。我的目标是将RA变量分为不同的组,高组、中组和低组。第一步是使用分位数函数基于RA创建不同的级别。这不是问题:在R.条件下循环通过data.table进行比较的问题没有改变,r,data.table,R,Data.table,我在数据表中创建分类变量时遇到问题。我的目标是将RA变量分为不同的组,高组、中组和低组。第一步是使用分位数函数基于RA创建不同的级别。这不是问题: base.dat <- read.csv("file:///C:/Users/Owner/Documents/baseball csv.csv", header=TRUE) base.dat.70 <- base.dat[base.dat$yearID>=1970, ] base.dat.70.reduce &l
base.dat <- read.csv("file:///C:/Users/Owner/Documents/baseball csv.csv", header=TRUE)
base.dat.70 <- base.dat[base.dat$yearID>=1970, ]
base.dat.70.reduce <- base.dat.70[ , c(1, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 27)]
table <- data.table(base.dat.70.reduce)
table[ ,med.RA:=median(RA), by=yearID]
table[ ,RA.low:=quantile(RA, .33), by=yearID]
table[,RA.high:=quantile(RA, .67), by=yearID]
base.dat我将演示fcase
和嵌套的fifelse
(如果您使用的是1.13.0之前的版本)
MT高,“高”)]
MT[,intrvl2:=
第五(显示<低,“低”,
第五(显示>高,“高”,“中”)]
机器翻译
#mpg气缸显示hp drat wt qsec与am齿轮carb lo med hi intrvl1 intrvl2
#1:21.06160.01103.902.62016.4601414160.00167.6168.748中等
#2:21.06160.01103.902.87517.0201414160.00167.6168.748中等
#3:22.84108.0933.852.32018.6114183.83108.01220.240中等
#4:21.4 6258.0 110 3.08 3.215 19.44 1 0 3 1 160.00 167.6 168.748偏高
#5:18.7 8 360.0 175 3.15 3.440 17.02 0 3 2 308.06 350.5 360.000中等教育
# ---
#28:30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 83.83 108.0 120.240中等
#29:15.8 8351.0 264 4.22 3.170 14.50 01 5 4 308.06 350.5 360.000中等教育
#30:19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 160.00 167.6 168.748低-低
#31:15.08301.03353.543.57014.6000158308.06350.5360.000低
#32:21.44121.01094.11278018.601114283.83108.0120.240偏高
一些注意事项:
- 我使用
data.table::between
(完全限定),因为我也经常加载dplyr
,它的between
版本要求第二个和第三个参数为length-1,从而中断任何向量化操作<代码>数据。table::between
接受长度相同(或1)的所有三个参数
fcase
代码中,我演示了在之间不需要的情况,因为我们可以测试lo
和hi
,其他一切都在它们之间
fcase
置于嵌套fifelse
之上;虽然性能可能更好(我还没有测试过),但我认为fcase
的可读性(因此可维护性)要好得多。嵌套的fifelse
很容易错过缩进,忘记在“ifs”中的位置
by=RA
),通常最好在R中的向量中执行操作。不过,在您的尝试中,您是按数值进行分组,这通常是唯一的,但肯定存在歧义的空间。如果您必须看到行方式的解决方案,那么最好使用by=seq_len(nrow(DT))
:
MT[,intrvl3:=c(“低”、“中”、“高”)[findInterval(disp,c(-Inf,lo,hi,Inf)),
by=序号(nrow(MT))]
机器翻译
#mpg气缸显示hp drat wt qsec与am齿轮carb lo med hi intrvl1 intrvl2 intrvl3
#1:21.06160.01103.902.62016.4601414160.00167.6168.748中等
#2:21.06160.01103.902.87517.0201414160.00167.6168.748中等
#3:22.84108.0933.852.32018.6114183.83108.01220.240中等
#4:21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 160.00 167.6 168.748偏高
#5:18.7 8 360.0 175 3.15 3.440 17.02 0 3 2 308.06 350.5 360.000中等偏高
# ---
#28:30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 83.83 108.0 120.240中等
#29:15.8 8351.0 264 4.22 3.170 14.50 01 5 4 308.06 350.5 360.000中等教育
#30:19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 160.00 167.6 168.748低
#31:15.08301.03353.543.57014.6000158308.06350.5360.000低
#32:21.4121.01094.11278018.6011283.83108.01220.240偏高
正如你所看到的,这是一个右闭现象
您似乎需要
fcase
,请参见基本函数cut()
是否也能满足您的需要?非常感谢您的帮助!我对数据表很陌生,所以这将对我有很大帮助。如果这能回答你们的问题,请。谢谢
table[ , RA.level:= { if (RA <RA.low) "Low RA"
else if (RA <RA.high) "Medium RA"
else "High RA"}, by=RA]
kable(head(table))
kable(tail(table))