dnatheist
dnatheist

Reputation: 77

Filling values from pairs within dataframe

My dataframe looks like this (but is 285 x 12300) with some scattered na :

     X5f65665a X8c267f9f X169df433 X5742e722 X148d530d X88febf48
F185 X5f65665a         0 X169df433         0 X148d530d X88febf48
F186 X5f65665a         0 X169df433         0 X148d530d         0
M187 X5f65665a X8c267f9f X169df433         0 X148d530d X88febf48
F188 0         X8c267f9f X169df433         0 X148d530d         0
M189 X5f65665a X8c267f9f X169df433         0 X148d530d X88febf48
F190 X5f65665a         0 X169df433         0 X148d530d X88febf48

After rownames on left, the columns are in pairs (cols 1&2 ; 3&4 etc). I need to replace any "0" with the partner value from that pair. So (1,2) should become X5f65665a and (4,1) should become X8c267f9f.

Upvotes: 0

Views: 41

Answers (1)

Ven Yao
Ven Yao

Reputation: 3710

d1 <- read.table(text="
     X5f65665a X8c267f9f X169df433 X5742e722 X148d530d X88febf48
F185 X5f65665a         0 X169df433         0 X148d530d X88febf48
F186 X5f65665a         0 X169df433         0 X148d530d         0
M187 X5f65665a X8c267f9f X169df433         0 X148d530d X88febf48
F188 0         X8c267f9f X169df433         0 X148d530d         0
M189 X5f65665a X8c267f9f X169df433         0 X148d530d X88febf48
F190 X5f65665a         0 X169df433         0 X148d530d X88febf48", 
                 head=T, as.is=T, row.names=1)

d1.lst <- lapply(seq(1, ncol(d1), by=2), function(x){return(d1[, x:(x+1)])})
d1.lst.fil <- lapply(d1.lst, function(x){
  x[,1][x[,1]==0] <- x[,2][x[,1]==0]
  x[,2][x[,2]==0] <- x[,1][x[,2]==0]
  return(x)
})

d2 <- do.call(cbind, d1.lst.fil)
#      X5f65665a X8c267f9f X169df433 X5742e722 X148d530d X88febf48
# F185 X5f65665a X5f65665a X169df433 X169df433 X148d530d X88febf48
# F186 X5f65665a X5f65665a X169df433 X169df433 X148d530d X148d530d
# M187 X5f65665a X8c267f9f X169df433 X169df433 X148d530d X88febf48
# F188 X8c267f9f X8c267f9f X169df433 X169df433 X148d530d X148d530d
# M189 X5f65665a X8c267f9f X169df433 X169df433 X148d530d X88febf48
# F190 X5f65665a X5f65665a X169df433 X169df433 X148d530d X88febf48

UPDATE (to dnatheist):

The isssue is caused by "NA". Try the following scripts. It will leave "NA" unchanged.

d1.lst.fil <- lapply(d1.lst, function(x){
  x[,1][!is.na(x[,1]) & x[,1]=="0"] <- x[,2][!is.na(x[,1]) & x[,1]=="0"]
  x[,2][!is.na(x[,2]) & x[,2]=="0"] <- x[,1][!is.na(x[,2]) & x[,2]=="0"]
  return(x)
})

Upvotes: 1

Related Questions