rfor-loopif-statementlabelhmisc

Creating a loop to add labels to colums: library(Hmisc)


I have a dataset which looks something like this:

  Year      Country  Matchcode  P             H
1 2000      France        0001  1213          1872     
2 2001      France        0002  1234          2345      
3 2000      UK            0003  1726          2234      
4 2001      UK            0004  6433          9082  

I have another dataset which looks something like this:

Indicator Code  Indicator Name
P               Power
H               Happiness

I would like to add info in the second column of the second dataset (Power, Happiness) as a label to the abbreviation used in the first dataset with a loop, but I don't know exactly how to write the loop.

This is how far I got:

library(Hmisc)
for i in df2[,1]{
if (df1[,i] == df2[i,]){
label(df1[,i]) <- df2[i,2]
}}

But this merely checks whether names are the same and does not search for it. Could anyone guide further?

Desired output:

enter image description here

  Year      Country  Matchcode  P(label=Power) H(label=Happiness)
1 2000      France        0001            1213              1872     
2 2001      France        0002            1234              2345      
3 2000      UK            0003            1726              2234      
4 2001      UK            0004            6433              9082  

Solution

  • If you specifically want to use a loop, this approach gives the output you describe:

    df <- data.frame(Year = c(2000, 2001, 2000, 2001),
                     Country = c("France", "France", "UK","UK"),
                     Matchcode = c("0001", "0002", "0003", "0004"),
                     P = c(1213, 1234, 1726, 6433),
                     H = c(1872, 2345, 2234, 9082))
    
    lookup <- data.frame(code = c ("P", "H"),
                         label = c("Power", "Happiness"),
                         stringsAsFactors = FALSE)
    
    for (i in 1:length(colnames(df))) {
      if(!is.na(match(colnames(df), lookup$code)[i])) {
        Hmisc::label(df[[i]]) <- lookup$label[(match(colnames(df), lookup$code))[i]]
      }
    }
    

    This works:

    Hmisc::label(df[4])
    #       P 
    # "Power" 
    

    It also checks out in the RStudio viewer:

    Screen shot of RStudio object viewer showing the variables with Hmisc labels, as desired.

    Like several of the other answerers and commenters, I had originally thought you wanted to append the "label = " text to the column names. For anyone wanting that, this is the (loop) code.

    for (i in 1:length(colnames(df))) {
      if(!is.na(match(colnames(df), lookup$code)[i])) {
        colnames(df)[i] <- paste0(colnames(df)[i],
                                  "(label=",
                                  lookup$label[(match(colnames(df), lookup$code))[i]],
                                  ")")
      }
    }