2015-07-23 1 views
0

У меня эта таблица называется mydf. У меня есть сотни столбцов, начинающихся с «ssd». Мне нужно grep эти coummns и преобразовать значения в них в 0/0, если есть только одна буква и 0/1, если есть две буквы. Мне также нужно пропустить ячейки (ничего не делать с ними), которые имеют «ND», пустые ячейки или что-то другое, кроме комбинации букв «A», «T», «G» и «C». таблица результатов должна выглядеть как myresult.Как заменить значения в столбцах выбора в R?

mydf

wws:ddf:xx ssd:ddf:xx sqt:ddf:xx wws:dde:xy ssd:dde:xy sqt:dde:xy 
       G          GA 
       GA         AT 
       GT          
       ND         GA 
       GT         TG 
       G          A 

myresult

wws:ddf:xx ssd:ddf:xx sqt:ddf:xx wws:dde:xy ssd:dde:xy sqt:dde:xy 
       0/0         0/1 
       0/1         0/1 
       0/1           
       ND         0/1 
       0/1         0/1 
       0/0         0/0 
+2

Это поможет вы получите больше (и более быстрых) ответов в будущем, если вы можете указать способ легко воспроизвести свои данные в своем вопросе, а не оставить его другим, чтобы попытаться воспроизвести его с вашего выхода. – Ricky

ответ

1

воспроизводя образец данных с этим кодом

mydf <- 
    structure(list(`wws:ddf:xx` = c("", "", "", "", "", ""), 
       `ssd:ddf:xx` = c("G", "GA", "GT", "ND", "GT", "G"), 
       `sqt:ddf:xx` = c("", "", "", "", "", ""), 
       `wws:dde:xy` = c("", "", "", "", "", ""), 
       `ssd:dde:xy` = c("GA", "AT", "", "GA", "TG", "A"), 
       `sqt:dde:xy` = c("", "", "", "", "", "")), 
      .Names = c("wws:ddf:xx", "ssd:ddf:xx", "sqt:ddf:xx", "wws:dde:xy", "ssd:dde:xy", "sqt:dde:xy"), 
      row.names = c(NA, -6L), class = "data.frame") 

создать функцию для выполнения изменений в одном столбце

change <- function(x) { 
    # for ease, change all valid letters to digit 1 
    y <- gsub("[ATGC]", "1", x) 
    # count number of digits 1 
    z <- sapply(strsplit(y, ""), function(x) sum(x=="1")) 
    # corresponding text for number of digits (1 or 2), to be mapped later 
    txt <- c("0/0", "0/1") 
    # identify rows where digits 1 are found 
    idx <- which(z>0) 
    # if there's digit 1 replace with corresponding text in mapping above 
    x[idx] <- txt[z[idx]] 
    return(x) 
} 

Затем определить столбцы, которые начинаются с ССД

ssdcols <- grep("^ssd", names(mydf)) 

и применить функцию для всех таких столбцов (экономия в dataframe)

mydf[, ssdcols] <- as.data.frame(lapply(mydf[, ssdcols], change), 
           stringsAsFactors=F) 

Выход, как хотел

> mydf 
    wws:ddf:xx ssd:ddf:xx sqt:ddf:xx wws:dde:xy ssd:dde:xy sqt:dde:xy 
1     0/0        0/1   
2     0/1        0/1   
3     0/1            
4     ND        0/1   
5     0/1        0/1   
6     0/0        0/0 
+0

Большое вам спасибо! – MAPK

Смежные вопросы