2015-11-24 4 views
4

У меня есть dataframe, столбцы которой состоит из случайно распределенных значений и ВПЛ, как показано ниже:Dataframe манипуляции в R - Сдвинуть ячейки влево и удалить Nas

a<-c("S","E","NA","S","NA") 
b<-c("A","NA","M","G","K") 
c<-c("I","NA","NA","NA","L") 
meh<-dataframe(a,b,c) 

# [,1] [,2] [,3] [,4] [,5] 
#a "S" "E" "NA" "S" "NA" 
#b "A" "NA" "M" "G" "K" 
#c "I" "NA" "NA" "NA" "L" 

Я хочу, чтобы удалить все Nas и смещать non-NA слева - это должно выглядеть так:

# [,1] [,2] [,3] [,4] 
#a "S" "E" "S" 
#b "A" "M" "G" "K" 
#c "I" "L" 

Любые идеи?

+0

Подсказка: 'dataframe' должен быть' data.frame', который не даст вам результат. 'meh <- rbind (a, b, c)' будет. Также '' NA "' является строкой, которая не совпадает с отсутствием значения NA. – thelatemail

+1

что-то вроде 'lapply (1: nrow (meh), function (x) meh [x,] [! Meh [x,] ==" NA "])'? Вы не можете иметь data.frame (или матрицу) с оборванными концами вроде этого. – jeremycg

ответ

0

Это может помочь, если вы укажете, что вы хотите делать с данными после завершения этого процесса, но вот способ избавиться от NA в каждом столбце и сохранить их в переменной. То есть, если у вас на самом деле есть НС. Я изменил ваш примерный набор данных, чтобы отразить комментарии выше, чтобы включить NA, а не «NA».

a<-c("S","E",NA,"S",NA) 
b<-c("A",NA,"M","G","K") 
c<-c("I",NA,NA,NA,"L") 
meh<-data.frame(a,b,c) 

newcol<-na.omit(meh$a) #Removes all NA's from your column 
newcol<-newcol[1:length(newcol)] #Gives you an output without any NA's 

То же самое можно сделать с каждой строкой, как предлагает jeremycg, используя lapply.

lapply(1:nrow(meh), function(x) meh[x,][is.na(meh[x,])==F]) 
1

Мы можем также использовать stri_list2matrix

library(stringi) 
stri_list2matrix(lapply(meh, function(x) x[x!='NA']), fill='', byrow=TRUE) 
# [,1] [,2] [,3] [,4] 
#[1,] "S" "E" "S" "" 
#[2,] "A" "M" "G" "K" 
#[3,] "I" "L" "" "" 
+0

Можно ли это сделать, используя grep или содержащий (или нечто подобное) для вашего идентификатора вместо «NA»? –

+0

@Phil_T Я думаю, что ОП совершил ошибку, создав строку символов для «NA». Вместо этого он должен быть «NA» без кавычек, и тогда его легче идентифицировать с помощью 'is.na'. Здесь '' NA "' является точным соответствием, поэтому '! =' Требуется только, если вы хотите использовать 'grep', тогда используйте аргумент' fixed = TRUE' – akrun

0

После того, как векторы разных размеров, это не имеет смысла colbind их обратно в широкой форме. Вместо этого

library(dplyr) 
library(tidyr) 

meh %>% 
    gather(variable, value) %>% 
    filter(!is.na(value)) 
Смежные вопросы