S Das
S Das

Reputation: 3391

Collapse Two Column Values into a New Column

I have a dataset like the following:

dat1 <- read.table(header=TRUE, text="
          ID  Pa  Gu  Ta
          8645    Rel345  Gel294  Tel452
          6228    Rel345  Gel294  Tel467
          5830    Rel345  Gel294  Tel467
          1844    Rel345  Gel295  Tel467
          4461    Rel345  Gel295  Tel467
          2119    Rel345  Gel294  Tel452
          ")
dat1
    ID     Pa     Gu     Ta
1 8645 Rel345 Gel294 Tel452
2 6228 Rel345 Gel294 Tel467
3 5830 Rel345 Gel294 Tel467
4 1844 Rel345 Gel295 Tel467
5 4461 Rel345 Gel295 Tel467
6 2119 Rel345 Gel294 Tel452

I want a new column based on a fixed text Number_00 and number of the rows. For example: first value of a new Id ID3would be Number_001 and then Number_002 and so on. I have done the following. I need help to get ID3.

dat1$ID1 <- c(1:nrow(dat1))
dat1
    ID     Pa     Gu     Ta ID1
1 8645 Rel345 Gel294 Tel452   1
2 6228 Rel345 Gel294 Tel467   2
3 5830 Rel345 Gel294 Tel467   3
4 1844 Rel345 Gel295 Tel467   4
5 4461 Rel345 Gel295 Tel467   5
6 2119 Rel345 Gel294 Tel452   6

dat1$ID2 <- "Number_00"
dat1
    ID     Pa     Gu     Ta ID1    ID2
1 8645 Rel345 Gel294 Tel452   1 Number_00
2 6228 Rel345 Gel294 Tel467   2 Number_00
3 5830 Rel345 Gel294 Tel467   3 Number_00
4 1844 Rel345 Gel295 Tel467   4 Number_00
5 4461 Rel345 Gel295 Tel467   5 Number_00
6 2119 Rel345 Gel294 Tel452   6 Number_00

Upvotes: 2

Views: 110

Answers (2)

Sam Dickson
Sam Dickson

Reputation: 5239

You can do everything in one step:

dat1$ID3 <- paste0("Number_00",1:nrow(dat1))

It's possible, however, that you won't want two leading zeros when you get to double digits. If that's the case you can do this (note that I increased to ten rows by duplicating the last four rows in your example):

dat1$ID3 <- paste0("Number_",sprintf("%03d",1:nrow(dat1)))
#     ID     Pa     Gu     Ta        ID3
#1  8645 Rel345 Gel294 Tel452 Number_001
#2  6228 Rel345 Gel294 Tel467 Number_002
#3  5830 Rel345 Gel294 Tel467 Number_003
#4  1844 Rel345 Gel295 Tel467 Number_004
#5  4461 Rel345 Gel295 Tel467 Number_005
#6  2119 Rel345 Gel294 Tel452 Number_006
#7  5830 Rel345 Gel294 Tel467 Number_007
#8  1844 Rel345 Gel295 Tel467 Number_008
#9  4461 Rel345 Gel295 Tel467 Number_009
#10 2119 Rel345 Gel294 Tel452 Number_010

With the first method, the last ID3 would be Number_0010.

Upvotes: 2

talat
talat

Reputation: 70266

You can use do.call to call paste0 on every row of the data:

dat1$ID3 <- do.call(paste0, dat1[c("ID2", "ID1")])
dat1
#    ID     Pa     Gu     Ta ID1       ID2        ID3
#1 8645 Rel345 Gel294 Tel452   1 Number_00 Number_001
#2 6228 Rel345 Gel294 Tel467   2 Number_00 Number_002
#3 5830 Rel345 Gel294 Tel467   3 Number_00 Number_003
#4 1844 Rel345 Gel295 Tel467   4 Number_00 Number_004
#5 4461 Rel345 Gel295 Tel467   5 Number_00 Number_005
#6 2119 Rel345 Gel294 Tel452   6 Number_00 Number_006

Upvotes: 2

Related Questions