Reputation: 77
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
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