Use merge. expts <- read.csv( text "expt,sample ex1,sample1-1 ex1,sample1-2 ex2,sample2-1 ex2,sample2-2 ex2,sample2-3 ", header=TRUE, as.is=TRUE ) mydata <- data.frame(sample = c("sample2-2", "sample2-3", "sample1-1", "sample1-1", "sample1-1", "sample2-1")) merge( mydata, expts, by="sample", all.x=TRUE ) On March 10, 2022 7:50:23 AM PST, Ivan Calandra <ivan.calandra at rgzm.de> wrote:>Dear useRs, > >I would like to improve my ugly (though working) code, but I think I >need a completely different approach and I just can't think out of my box! > >I have some external information about which sample(s) belong to which >experiment. I need to get that manually into R (either typing directly >in a script or read a CSV file, but that makes no difference): >exp <- list(ex1 = c("sample1-1", "sample1-2"), ex2 = c("sample2-1", >"sample2-2" , "sample2-3")) > >Then I have my data, only with the sample IDs: >mydata <- data.frame(sample = c("sample2-2", "sample2-3", "sample1-1", >"sample1-1", "sample1-1", "sample2-1")) > >Now I want to add a column to mydata with the experiment ID. The best I >could find is that: >for (i in names(exp)) mydata[mydata[["sample"]] %in% exp[[i]], >"experiment"] <- i > >In this example, the experiment ID could be extracted from the sample >IDs, but this is not the case with my real data so it really is a matter >of matching. Of course I also have other columns with my real data. > >I'm pretty sure the last line (with the loop) can be improved in terms >of readability (speed is not an issue here). I have close to no >constraints on 'exp' (here I chose a list, but anything could do), the >only thing that cannot change is the format of 'mydata'. > >Thank you in advance! >Ivan >-- Sent from my phone. Please excuse my brevity.
Ebert,Timothy Aaron
2022-Mar-10 17:58 UTC
[R] conditional filling of data.frame - improve code
You could try some of the "join" commands from dplyr. https://dplyr.tidyverse.org/reference/mutate-joins.html https://statisticsglobe.com/r-dplyr-join-inner-left-right-full-semi-anti Regards, Tim -----Original Message----- From: R-help <r-help-bounces at r-project.org> On Behalf Of Jeff Newmiller Sent: Thursday, March 10, 2022 11:25 AM To: r-help at r-project.org; Ivan Calandra <ivan.calandra at rgzm.de>; R-help <r-help at r-project.org> Subject: Re: [R] conditional filling of data.frame - improve code [External Email] Use merge. expts <- read.csv( text "expt,sample ex1,sample1-1 ex1,sample1-2 ex2,sample2-1 ex2,sample2-2 ex2,sample2-3 ", header=TRUE, as.is=TRUE ) mydata <- data.frame(sample = c("sample2-2", "sample2-3", "sample1-1", "sample1-1", "sample1-1", "sample2-1")) merge( mydata, expts, by="sample", all.x=TRUE ) On March 10, 2022 7:50:23 AM PST, Ivan Calandra <ivan.calandra at rgzm.de> wrote:>Dear useRs, > >I would like to improve my ugly (though working) code, but I think I >need a completely different approach and I just can't think out of my box! > >I have some external information about which sample(s) belong to which >experiment. I need to get that manually into R (either typing directly >in a script or read a CSV file, but that makes no difference): >exp <- list(ex1 = c("sample1-1", "sample1-2"), ex2 = c("sample2-1", >"sample2-2" , "sample2-3")) > >Then I have my data, only with the sample IDs: >mydata <- data.frame(sample = c("sample2-2", "sample2-3", "sample1-1", >"sample1-1", "sample1-1", "sample2-1")) > >Now I want to add a column to mydata with the experiment ID. The best I >could find is that: >for (i in names(exp)) mydata[mydata[["sample"]] %in% exp[[i]], >"experiment"] <- i > >In this example, the experiment ID could be extracted from the sample >IDs, but this is not the case with my real data so it really is a >matter of matching. Of course I also have other columns with my real data. > >I'm pretty sure the last line (with the loop) can be improved in terms >of readability (speed is not an issue here). I have close to no >constraints on 'exp' (here I chose a list, but anything could do), the >only thing that cannot change is the format of 'mydata'. > >Thank you in advance! >Ivan >-- Sent from my phone. Please excuse my brevity. ______________________________________________ R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_r-2Dhelp&d=DwICAg&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVeAsRzsn7AkP-g&m=Jzc7veojt_O3lQLFgC3O7ArDl8buUJGuuOHJZMWZJ9wTuTTwl_piuFOAv-w0ckT5&s=4HazMU4Mqs2oOcAkBrZd0VGrHX_lw6J1XozQNQ9RsHk&ePLEASE do read the posting guide https://urldefense.proofpoint.com/v2/url?u=http-3A__www.R-2Dproject.org_posting-2Dguide.html&d=DwICAg&c=sJ6xIWYx-zLMB3EPkvcnVg&r=9PEhQh2kVeAsRzsn7AkP-g&m=Jzc7veojt_O3lQLFgC3O7ArDl8buUJGuuOHJZMWZJ9wTuTTwl_piuFOAv-w0ckT5&s=LdQqnVBkEAmRk7baBZLPs2svUpN6DIYaznrka_X8maI&eand provide commented, minimal, self-contained, reproducible code.