【问题标题】:conditionally assign first nth element in vector as H and rests as L有条件地将向量中的第 n 个元素分配为 H,其余为 L
【发布时间】:2017-09-04 12:25:25
【问题描述】:

我有一个随机抽样数字的向量。例如,

vec1 <- sample(1:574)

我想将这个采样向量中的前 25% 的值指定为 H,其余元素指定为 L。我曾尝试使用 ifelse,但这会将 1 到 143 的值指定为 H,将大于 143 的值指定为 L。但我希望前 143 个值具有 H,其余为 L。对于下面的元素,我希望前 143 个元素(即前 4 行到 44 行)为 H,所有其余部分为 L。这意味着值 393 的第一个元素将获得 H ,第二个元素 518 也会得到 H。

> vec1
  [1] 393 518 179 358  78 185 168 386 321 114 163  18 217 302 191 167 465 427 342 422 406 144 183 438 546
 [26] 500 336 123  99 208 130   9 477 197  95  75 122 320 101 175 117 388 414 475 353 499  66 558 298 277
 [51]  35 522 293 343 165 194 563 482 219 274 104 164 484  11 333  67 180  57 221 470 211 447  63 212 148
 [76] 267 426 118  10  84 459 463  51  91 432 569 303 442 390 446 218  34 338 464 201 232 398 385 365 510
[101] 412 400  38 295 514 220 430 372  15 308 366 268 557 110 467 474  32 364 515  41 418 419 300 542 523
[126] 317 307 554 458 263  47 128 445 360 528  72 431 171 368  44 160 433 202 502  62 550 417  89 337 503
[151] 233 401 115  42 113 257 340 555 323  76 196 533  69 261  86 292  77 273 297 454 479 508   7  50 357
[176] 296 473 476 516 551  83 309 215 213 488 556 262 278 289 265 370 151 310   4 423 126 506  55 564 424
[201]  40  60 493 544  30 312  65 490 529 214 456 319  98 198 391 376 112 284 572 304 247 560 249 486 345
[226] 527 250 382 346 428  49 331 169 166 565 159 384 324 371 548 222 325 107 209 453 504 269 538 305   6
[251] 125  82 238 481 487 339 129 237 108 139 141 441 471 562 178 517 146 468 480 182 352 460  28 543 363
[276]  96   8 252 301 526 281 119  16  13 157 280 530 143 524 276 256 316 254 205 200 332 425 440 573   2
[301] 149 539 206 497  31 315 228   1 199 552  21 436 498 109  26 158 111  90 330 313 491  54 204 103 520
[326]  61 466 253 329  64 241 124  37  19 351 505 405 513 246 429 258 547 176 496 381 451 186 172 350 354
[351] 347 469 416 449  68 525 404 549 413 134 367 216 373 136 306 568 121 190 355 156 361 566 181 411 236
[376] 161  43 311 138 359  81 439 155 374 570 223 344   3 264  36  27  71 348 452 288 174 407  52 396 255
[401] 187 455 369 224 314 127 379  12  94 328 341 271  48 327 402 443 478 450  87  17 380 287 279  39  85
[426] 509  45 483 457 521 231 349 152 105  73 494 251 207 420 135 120 435  33  22 286 153 535 421 285 235
[451]  80  93 395 540 489 154 322  46  59 392 326 195 409  25 177 100 545  24 170 472 142 437  74 270 495
[476]  56 410  20 188 394 561 415  58 229  79 227 531 203 242 162 574 272 541   5 283 448  88 137 239 507
[501] 356 383 243 290 536 444 387 234  14 461 282  29 534 132 192 275 133 230 259 375 537 532  70 184 512
[526] 260  92 106 131 434 225 102 362 147 408 173 248 334 226 403 511 294 299 378 389 399 189 492 519 240
[551] 116 266 501  23 193 145 567 140  97 335  53 210 291 553 571 377 485 150 318 244 245 397 559 462
> 

【问题讨论】:

    标签: r vector conditional


    【解决方案1】:

    我认为你的意思是:

    vec1 <- sample(1:574)
    L = vec1[1:143]
    H = vec1[144:length(vec1)]
    

    无论如何,您都可以做到这一点:

    vec1 <- sample(1:574)
    num_to_25 <- floor(0.25*length(vec1))
    L = vec1[1:num_to_25]
    H = vec1[(num_to_25+1):length(vec1)]
    

    你可以使用的功能:

    assigner = function (input_vactor,percentage_of_L=25){
       num_to_25 <- floor(percentage_of_L*0.01*length(input_vactor))
       L = input_vactor[1:num_to_25]
       H = input_vactor[(num_to_25+1):length(input_vactor)]
       return (list(L=L,H=H))
    }
    

    并像这样使用它:

    vec1 <- sample(1:574)
    h = assigner(vec1)$H
    l = assigner(vec1)$L
    

    Edit for Edit:对于您已编辑的问题,将第二个函数更改为:

    sensitivity.rand <- function(vector, threshold){
      num_to_thres <- floor(threshold*0.01*length(vector))
      l = length (vector)
      score = c(rep("L",num_to_thres),rep("H",l-num_to_thres))
      return(score)
    } 
    

    【讨论】:

    • 谢谢。但我希望将其作为一行代码来分配值。试想一下,我希望前 143 个元素为 H,其余为 L,并带有更小的一行代码。我将在函数中使用此代码。该函数将采用向量并将前 143 个元素指定为 H,其余元素指定为 L。
    • 我发布并编辑!聊聊吧!我希望这次能有所帮助。
    • 谢谢。你接近我的期望。我写了一个函数:set.threshold.rand &lt;- function(value, vector){threshold &lt;- round(value/100*length(vector))return(threshold)}和第二个sensitivity.rand &lt;- function(vector, threshold){thresh &lt;- set.threshold.rand(threshold, vector)score &lt;- ifelse(vector &lt;= thresh, "H", "L")return(score)}vec1 &lt;- 1:574@987654将 H 分配给小于 144 的元素,但我希望第一个 144 元素将获得 H(无论它小于还是大于 144)。
    • 也许你可以在我的第二个函数中编辑第三行。我只是卡在这里。
    • 我在我的回答中发布了您的功能的编辑!希望最后有所帮助。 @AnwarHossain
    【解决方案2】:

    caretpackage 包含 createDataPartition 功能,可以完成这项工作:

    library("caret")
    
    SAMPLE_SIZE <- 0.25
    SIZE_VECT <- 574
    
    # Set seed for reproducibility
    set.seed(pi)
    
    vec1 <- sample(1:SIZE_VECT)
    
    in_sample <- createDataPartition(y = vec1, p = SAMPLE_SIZE, list = FALSE)
    H <- vec1[in_sample]
    L <- vec1[-in_sample]
    # Actual sample size
    100 * length(H) / (length(L) + length(H))
    #  [1] 25.08711
    

    【讨论】:

    • 谢谢。但我希望将其作为一行代码来分配值。试想一下,我希望前 143 个元素为 H,其余为 L,并带有更小的一行代码。我想在函数中使用这段代码。该函数将采用向量并将前 143 个元素指定为 H,其余元素指定为 L。
    猜你喜欢
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多