0

Hi programming fellows,

Please consider the following data frame:

df <- structure(list(date = structure(c(1251350100.288, 1251351900, 
1251353699.712, 1251355500.288, 1251357300, 1251359099.712), class = c("POSIXct", 
"POSIXt")), mix.ratio.csi = c(442.78316237477, 436.757082063885, 
425.742872761246, 395.770804307671, 386.758335309866, 392.115887652156
), mix.ratio.licor = c(447.141491945547, 441.319548211994, 430.854166343173, 
402.232640566763, 393.683007533694, 398.388336602215), ToKeep = c(FALSE, 
FALSE, TRUE, TRUE, TRUE, TRUE)), .Names = c("date", "value1", 
"value2", "ToKeep"), index = structure(integer(0), ToKeep = c(1L, 
2L, 8L, 52L, 53L, 54L, 55L, 85L, 86L, 87L, 88L, 89L, 92L, 93L, 
94L, 95L, 96L, 97L, 98L, 99L, 100L, 102L, 103L, 105L, 106L, 192L, 
193L, 220L, 223L, 225L, 228L, 229L, 260L, 263L, 264L, 265L, 266L, 
267L, 305L, 306L, 307L, 308L, 309L, 310L, 311L, 312L, 313L, 314L, 
315L, 352L, 353L, 354L, 375L, 376L, 378L, 379L, 380L, 383L, 411L, 
412L, 413L, 414L, 415L, 416L, 418L, 419L, 445L, 453L, 463L, 464L, 
465L, 466L, 467L, 468L, 497L, 504L, 547L, 548L, 549L, 586L, 589L, 
630L, 631L, 632L, 633L, 634L, 635L, 636L, 644L, 645L, 646L, 647L, 
648L, 649L, 650L, 651L, 674L, 675L, 676L, 677L, 678L, 682L, 687L, 
690L, 691L, 724L, 725L, 726L, 727L, 728L, 729L, 730L, 731L, 732L, 
733L, 734L, 735L, 736L, 739L, 740L, 741L, 742L, 768L, 771L, 772L, 
773L, 774L, 775L, 776L, 777L, 778L, 779L, 3L, 4L, 5L, 6L, 7L, 
9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 
22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 
35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 
48L, 49L, 50L, 51L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 
65L, 66L, 67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 
78L, 79L, 80L, 81L, 82L, 83L, 84L, 90L, 91L, 101L, 104L, 107L, 
108L, 109L, 110L, 111L, 112L, 113L, 114L, 115L, 116L, 117L, 118L, 
119L, 120L, 121L, 122L, 123L, 124L, 125L, 126L, 127L, 128L, 129L, 
130L, 131L, 132L, 133L, 134L, 135L, 136L, 137L, 138L, 139L, 140L, 
141L, 142L, 143L, 144L, 145L, 146L, 147L, 148L, 149L, 150L, 151L, 
152L, 153L, 154L, 155L, 156L, 157L, 158L, 159L, 160L, 161L, 162L, 
163L, 164L, 165L, 166L, 167L, 168L, 169L, 170L, 171L, 172L, 173L, 
174L, 175L, 176L, 177L, 178L, 179L, 180L, 181L, 182L, 183L, 184L, 
185L, 186L, 187L, 188L, 189L, 190L, 191L, 194L, 195L, 196L, 197L, 
198L, 199L, 200L, 201L, 202L, 203L, 204L, 205L, 206L, 207L, 208L, 
209L, 210L, 211L, 212L, 213L, 214L, 215L, 216L, 217L, 218L, 219L, 
221L, 222L, 224L, 226L, 227L, 230L, 231L, 232L, 233L, 234L, 235L, 
236L, 237L, 238L, 239L, 240L, 241L, 242L, 243L, 244L, 245L, 246L, 
247L, 248L, 249L, 250L, 251L, 252L, 253L, 254L, 255L, 256L, 257L, 
258L, 259L, 261L, 262L, 268L, 269L, 270L, 271L, 272L, 273L, 274L, 
275L, 276L, 277L, 278L, 279L, 280L, 281L, 282L, 283L, 284L, 285L, 
286L, 287L, 288L, 289L, 290L, 291L, 292L, 293L, 294L, 295L, 296L, 
297L, 298L, 299L, 300L, 301L, 302L, 303L, 304L, 316L, 317L, 318L, 
319L, 320L, 321L, 322L, 323L, 324L, 325L, 326L, 327L, 328L, 329L, 
330L, 331L, 332L, 333L, 334L, 335L, 336L, 337L, 338L, 339L, 340L, 
341L, 342L, 343L, 344L, 345L, 346L, 347L, 348L, 349L, 350L, 351L, 
355L, 356L, 357L, 358L, 359L, 360L, 361L, 362L, 363L, 364L, 365L, 
366L, 367L, 368L, 369L, 370L, 371L, 372L, 373L, 374L, 377L, 381L, 
382L, 384L, 385L, 386L, 387L, 388L, 389L, 390L, 391L, 392L, 393L, 
394L, 395L, 396L, 397L, 398L, 399L, 400L, 401L, 402L, 403L, 404L, 
405L, 406L, 407L, 408L, 409L, 410L, 417L, 420L, 421L, 422L, 423L, 
424L, 425L, 426L, 427L, 428L, 429L, 430L, 431L, 432L, 433L, 434L, 
435L, 436L, 437L, 438L, 439L, 440L, 441L, 442L, 443L, 444L, 446L, 
447L, 448L, 449L, 450L, 451L, 452L, 454L, 455L, 456L, 457L, 458L, 
459L, 460L, 461L, 462L, 469L, 470L, 471L, 472L, 473L, 474L, 475L, 
476L, 477L, 478L, 479L, 480L, 481L, 482L, 483L, 484L, 485L, 486L, 
487L, 488L, 489L, 490L, 491L, 492L, 493L, 494L, 495L, 496L, 498L, 
499L, 500L, 501L, 502L, 503L, 505L, 506L, 507L, 508L, 509L, 510L, 
511L, 512L, 513L, 514L, 515L, 516L, 517L, 518L, 519L, 520L, 521L, 
522L, 523L, 524L, 525L, 526L, 527L, 528L, 529L, 530L, 531L, 532L, 
533L, 534L, 535L, 536L, 537L, 538L, 539L, 540L, 541L, 542L, 543L, 
544L, 545L, 546L, 550L, 551L, 552L, 553L, 554L, 555L, 556L, 557L, 
558L, 559L, 560L, 561L, 562L, 563L, 564L, 565L, 566L, 567L, 568L, 
569L, 570L, 571L, 572L, 573L, 574L, 575L, 576L, 577L, 578L, 579L, 
580L, 581L, 582L, 583L, 584L, 585L, 587L, 588L, 590L, 591L, 592L, 
593L, 594L, 595L, 596L, 597L, 598L, 599L, 600L, 601L, 602L, 603L, 
604L, 605L, 606L, 607L, 608L, 609L, 610L, 611L, 612L, 613L, 614L, 
615L, 616L, 617L, 618L, 619L, 620L, 621L, 622L, 623L, 624L, 625L, 
626L, 627L, 628L, 629L, 637L, 638L, 639L, 640L, 641L, 642L, 643L, 
652L, 653L, 654L, 655L, 656L, 657L, 658L, 659L, 660L, 661L, 662L, 
663L, 664L, 665L, 666L, 667L, 668L, 669L, 670L, 671L, 672L, 673L, 
679L, 680L, 681L, 683L, 684L, 685L, 686L, 688L, 689L, 692L, 693L, 
694L, 695L, 696L, 697L, 698L, 699L, 700L, 701L, 702L, 703L, 704L, 
705L, 706L, 707L, 708L, 709L, 710L, 711L, 712L, 713L, 714L, 715L, 
716L, 717L, 718L, 719L, 720L, 721L, 722L, 723L, 737L, 738L, 743L, 
744L, 745L, 746L, 747L, 748L, 749L, 750L, 751L, 752L, 753L, 754L, 
755L, 756L, 757L, 758L, 759L, 760L, 761L, 762L, 763L, 764L, 765L, 
766L, 767L, 769L, 770L, 780L, 781L, 782L, 783L, 784L, 785L, 786L, 
787L, 788L, 789L)), row.names = c(NA, 6L), class = "data.frame")

I need to create a new data.frame with the following structure:

1) if column 'ToKeep' is TRUE, then columns 'date', 'value1' and 'value2' remain the same;

2) if column 'ToKeep' is FALSE, then columns 'value1' e 'value2' receive NA (and 'date' remains the same).

I have been trying to use ifelse so far, but still haven't found the right indexing procedure:

df[, c(2,3)] <- lapply(df[, 4], function(x) ifelse(x == FALSE, NA, x))

Any suggestion?

Thanks in advance, Thiago.

0

2 Answers 2

2

You can use the logical column to subset the rows, choose the columns you want, then assign the NA values with [<-

df2 <- df  ## so that we don't over-write the original data set
df2[!df2$ToKeep, c("value1", "value2")] <- NA

which results in

df2
#                  date   value1   value2 ToKeep
# 1 2009-08-26 22:15:00       NA       NA  FALSE
# 2 2009-08-26 22:45:00       NA       NA  FALSE
# 3 2009-08-26 23:14:59 425.7429 430.8542   TRUE
# 4 2009-08-26 23:45:00 395.7708 402.2326   TRUE
# 5 2009-08-27 00:15:00 386.7583 393.6830   TRUE
# 6 2009-08-27 00:44:59 392.1159 398.3883   TRUE
Sign up to request clarification or add additional context in comments.

Comments

1

You could replace the lapply command with

df[,2:3] <- lapply(df[,2:3], function(x) 
                  ifelse(df[,'ToKeep'], x, NA))

df
#                 date   value1   value2 ToKeep
#1 2009-08-27 01:15:00       NA       NA  FALSE
#2 2009-08-27 01:45:00       NA       NA  FALSE
#3 2009-08-27 02:14:59 425.7429 430.8542   TRUE
#4 2009-08-27 02:45:00 395.7708 402.2326   TRUE
#5 2009-08-27 03:15:00 386.7583 393.6830   TRUE
#6 2009-08-27 03:44:59 392.1159 398.3883   TRUE

Or instead of ifelse, you can use replace

df[,2:3] <- lapply(df[,2:3], function(x)
                    replace(x, !df[,'ToKeep'], NA ))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.