2013-09-24 19 views
0

У меня есть большой набор данных, где каждая строка может иметь одну ячейку с текстом, а остальные пустые. Есть ли способ подмножества этих строк с текстом только в заданном столбце, а остальные пустые?Подмножество через несколько столбцов с пустыми ячейками

Я знаю, что могу использовать, например. tmp[tmp$A!="" & tmp$B=="" & tmp$C=="" & tmp$D=="",], но, поскольку у меня ок. 30 столбцов, где я хотел бы запустить это для каждого столбца, это было бы довольно утомительно. Я пробовал следующее, но он не ведет себя так, как ожидалось.

tmp=data.frame(A=c("a","","","",""), 
      B=c("","b","","",""), 
      C=c("","","c","",""), 
       D=c("","","","D","")) 
#Attempting subsetting across multiple columns with tmp[,2:3] 
tmp[tmp[,1]!="" & tmp[,2:3]=="",] 
     A B C D 
1  a    
NA <NA> <NA> <NA> <NA> 

#But it results in creating rows with na 
tmp[tmp[,1]!="" & tmp[,2:4]=="",] 
     A B C D 
1  a    
NA <NA> <NA> <NA> <NA> 
NA.1 <NA> <NA> <NA> <NA> 

Где я хотел бы только в конечном итоге с:

A B C D 
1  a    

, которые затем будут использоваться в ifelse(), так что если есть только ячейка в столбце А с текстом, дать столбец E текст A, если только текст в столбце B содержит столбец E текст B

A B C D E 
    a     A 
     b    B 
       c   C 
        d D 

Предложения?

+1

принять посмотрите на 'complete.cases'. – Justin

+0

@ Justin, не вижу, как это поможет в моем случае. –

+0

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

ответ

2

В векторах кадра данных символов вашего образца преобразуется в факторы, так что вы можете удалить поведение по умолчанию R с помощью stringsAsFactors=FALSE в кадре данных выборки

tmp=data.frame(A=c("a","","","",""), 
        B=c("","b","","",""), 
        C=c("","","c","",""), 
        D=c("","","","D",""),stringsAsFactors=FALSE) 

Тогда вы можете получить то, что вы ожидаете:

kk<-tmp[tmp[,1]!="",] 
> kk 
    A B C D 
1 a 

ll<-tmp[tmp[,2]!="",] 
> ll 
    A B C D 
2 b 


tmp[1:4,"E"]<-names(is.na(c(tmp))) 
tmp 
    A B C D E 
1 a   A 
2 b  B 
3  c  C 
4  D D 
5   <NA> 

na.omit(tmp) 
    A B C D E 
1 a  A 
2 b  B 
3  c C 
4  D D 

............................................. .........................
Original comments:

Использование str(tmp)

str(tmp) 
'data.frame': 5 obs. of 4 variables: 
$ A: Factor w/ 2 levels "","a": 2 1 1 1 1 
$ B: Factor w/ 2 levels "","b": 1 2 1 1 1 
$ C: Factor w/ 2 levels "","c": 1 1 2 1 1 
$ D: Factor w/ 2 levels "","D": 1 1 1 2 1 

Так,

levels(tmp[,1]) 
[1] "" "a" 

Таким образом, вы должны использовать levels(tmp[,1]))==""

................... .............................................

+0

Извините за поздний ответ, но помощь была очень благодарна :) –

+0

Mmmh..I, похоже, не может сделать эту работу над кадром данных, который не является квадратичным, т.е. он имеет больше строк, чем столбцов. –

+0

Данные вашего образца содержат 5 строк и 4 столбца. Код работает здесь и, вероятно, должен работать в ваших реальных данных. – Metrics

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