Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R.条件下循环通过data.table进行比较的问题没有改变_R_Data.table - Fatal编程技术网

在R.条件下循环通过data.table进行比较的问题没有改变

在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

我在数据表中创建分类变量时遇到问题。我的目标是将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 <- 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
    ,其他一切都在它们之间

  • 如果您使用的是1.13.0版或更高版本,我强烈建议将
    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))