2016-02-22 5 views
1

Мои данные выглядит следующим образом: https://gist.github.com/anonymous/dea36ef7b86f71120d50манипулировать столбец на основе другого столбца

Сначала я загрузить данные, как показано ниже

df <- read.delim(".../sample.txt", header=TRUE, sep="\t", fill=TRUE, row.names=1) 

тогда я буду только держать столбцы, которые я хочу, как показано ниже

dfm<- df[,c(match(c('m'), colnames(df)), 
       unlist(lapply(c("mm"), 
          function(x) grep(x, colnames(df)))))] 

в качестве примера первые два столбца DFM выглядит так

row.names             
CON__A2A4G1               0.880950 
CON__A2A5Y0               0.034051 
CON__A2AB72               0.079625 
CON__ENSEMBL          NaN 
CON__ENSEMBL:ENSBTAP00000024146          0.133800 
CON__ENSEMBL:ENSBTAP00000024466;CON__ENSEMBL:ENSBTAP00000024462  0.288080 
CON__ENSEMBL:ENSBTAP00000025008          NaN 
CON__ENSEMBL:ENSBTAP00000038253          0.101990 
sp|O43790|KRT86_HUMAN;CON__O43790         0.970460 
sp|O76009|KT33A_HUMAN;CON__O76009;CON__Q6NTB9      0.521410 

Я хочу, чтобы создать другой фрейм данных или матрицу или ... что имена столбцов совпадают с ФР. , тогда проверьте второй столбец, если он имеет значение, затем вставьте имя первого столбца там, если оно NA или пустое, напишите NA или ничего то же самое для третьего столбца и четвертого ... до конца

Пример вывода (только для второго столбца) выглядит следующим образом.

CON__A2A4G1               
CON__A2A5Y0               
CON__A2AB72               
**Nothing**          
CON__ENSEMBL:ENSBTAP00000024146          
CON__ENSEMBL:ENSBTAP00000024466;CON__ENSEMBL:ENSBTAP00000024462  
**Nothing**          
CON__ENSEMBL:ENSBTAP00000038253          
+1

Подсказка: 'ifelse (is.na (dat $ columnIwanttocheck)," ", rownames (dat))' – Heroka

+0

@Heroka спасибо, я попытался использовать это, но я не мог использовать его, чтобы применить его для всех данных , – nik

+0

И вы действительно хотите сохранить строки с отсутствующими значениями? Если нет, вы можете использовать что-то вроде 'complete.cases'. В противном случае, если решение Heroka не работает, попробуйте использовать 'apply (your_data, 1, function (x) any (is.na (x))', чтобы получить индекс строк, которые вы хотите заполнить '** Nothing * * '. – coffeinjunky

ответ

0

Попробуйте следующее:

df <- read.delim("example.txt", header=TRUE, sep="\t", fill=TRUE, row.names=1, stringsAsFactors=FALSE, na.strings='') 
df[] <- lapply(df, as.numeric) 

dfm<- df[,c(match(c('Ratio.H.L.normalized'), colnames(df)), 
     unlist(lapply(c("Ratio.H.L.normalized.Mo"), 
         function(x) grep(x, colnames(df)))))] 

dfm[] <- lapply(dfm, function(x) ifelse(is.na(x), "", rownames(dfm))) 

Во-первых, я заменить все строки "NA" с фактическими NA с. Убедитесь, что все значения должны быть как числовыми, так и отсутствующими, иначе это очень важно. Затем, по всем столбцам, я заменяю значение именем rowname всякий раз, когда значение отсутствует.

Примечание 1: Интересно, в какой ситуации вышеуказанная процедура полезна, и на всякий случай ваше описание было немного выключено, и вы на самом деле хотите сохранить строки, где все значения не пропущены, посмотрите на ?complete.cases ,

Примечание 2: Ваш способ извлечения столбцов из вашего более крупного набора данных выглядит несколько сложным для меня. Я уверен, что это правильно, но вы также можете попробовать что-то по следующим направлениям:

library(dplyr) 
dfm <- select(df, contains("Ratio.H.L.normalized")) 

Это должно дать тот же результат, но гораздо легче читать.

Редактировать: Указано недоразумение о желаемом решении и переключено ifelse -statement вокруг, чтобы отразить комментарий.

Edit 2: потенциально простое решение было бы следующее:

name_mat <- matrix(rep(rownames(dfm), ncol(dfm)), ncol=ncol(dfm), nrow = length(rownames(dfm))) 
dfm_ind <- is.na(dfm) 

name_mat[!dfm_ind] <- NA 

Сначала я создаю большую матрицу, содержащую все rownames, что имеет те же размеры, что и начальный dfm dataframe. Затем я создаю индекс, который сообщает мне, какая из записей в фрейме данных dfm отсутствует. Затем я использую этот индекс для замены значений в матрице повторяющихся имен ростов. Если необходимо, вы можете изменить имена столбцов с помощью функций names() или colnames(), чтобы согласовать имена столбцов.

+0

спасибо, что решение, которое вы дали, было противоположно тому, что я искал. Я не хочу заменять NA именем имен строк. Посмотрите на результат, который я показал выше в моем вопросе – nik

+0

Это ответ. Dfm [ ] <- lapply (dfm, function (x) ifelse (is.na (x), "", rownames (dfm))) знаете ли вы, если мы можем сделать это любым другим способом? – nik

+0

Да, в 'R', вы можете делать все по-разному. Но почему вы хотите отклониться от этого подхода? Эта информация поможет понять, как должно выглядеть решение. В противном случае, если это решит вашу проблему, примите ответ, чтобы другие люди могли видеть, что проблема была решена. – coffeinjunky

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