Search code examples
rrowcbind

How to add new column depends on row value in R?


I am trying to add a new column (slot) to a data.frame, depending on the row value of id. The short representative data is as following.

        id                Cap         Rs       R_inv
  257   464A485SSEE3    1.41E-10    736665.125  1.36E-06
  258   464A485SSEE3    1.30E-10    364822.6875 2.74E-06
  289   464A485TSEB2    1.44E-10    111996.1016 8.93E-06
  290   464A485TSEB2    1.33E-10    108541      9.21E-06

I think we could write a loop function to add new column. But I hope to learn simple function such as cbind or raw$slot<-???


Solution

  • If you have a long table, probably could consider using "join" function of "dplyr" package.

    # First, here is your data:
    df <- structure(list(id = structure(c(1L, 1L, 2L, 2L), .Label = c("464A485SSEE3", 
    "464A485TSEB2"), class = "factor"), Cap = c(1.41e-10, 1.3e-10, 
    1.44e-10, 1.33e-10), Rs = c(736665.125, 364822.6875, 111996.1016, 
    108541), R_inv = c(1.36e-06, 2.74e-06, 8.93e-06, 9.21e-06)), .Names = c("id", 
    "Cap", "Rs", "R_inv"), class = "data.frame", row.names = c("257", 
    "258", "289", "290"))
    
    #               id      Cap       Rs    R_inv
    # 257 464A485SSEE3 1.41e-10 736665.1 1.36e-06
    # 258 464A485SSEE3 1.30e-10 364822.7 2.74e-06
    # 289 464A485TSEB2 1.44e-10 111996.1 8.93e-06
    # 290 464A485TSEB2 1.33e-10 108541.0 9.21e-06
    
    
    # Then create a matching table similar to below:
    match_table <- structure(list(id = structure(1:2, .Label = c("464A485SSEE3", 
    "464A485TSEB2"), class = "factor"), slot_no = structure(1:2, .Label = c("slot_1", 
    "slot_2"), class = "factor")), .Names = c("id", "slot_no"), class = "data.frame", row.names = c(NA, 
    -2L))
    
    #             id slot_no
    # 1 464A485SSEE3  slot_1
    # 2 464A485TSEB2  slot_2
    
    # Do joining
    library(dplyr)
    left_join(df, match_table)
    #             id      Cap       Rs    R_inv slot_no
    # 1 464A485SSEE3 1.41e-10 736665.1 1.36e-06  slot_1
    # 2 464A485SSEE3 1.30e-10 364822.7 2.74e-06  slot_1
    # 3 464A485TSEB2 1.44e-10 111996.1 8.93e-06  slot_2
    # 4 464A485TSEB2 1.33e-10 108541.0 9.21e-06  slot_2