2014-10-28 12 views
5

Mam ramki danych tak:R: Powrót pierwszym elementem i stanowisko w każdym rzędzie ramka danych

Keyword 1 2 3 4 5 
a  0.7 NA NA 0.3 0.4 
b   NA NA 0.5 NA NA 
c   NA 0.2 NA NA 0.3 
d   NA NA NA 0.3 0.4 

chciałbym dostać to tak, że wyniki dają mi to:

Keyword First Value 
a   1  0.7 
b   3  0.5 
c   2  0.2 
d   4  0.3 

Jak miałbym to zrobić?

Dzięki.


Rozwiązanie zadziałało cuda.

Co jeśli chcę ostatnią wartość tak, że wynik wygląda tak:

Keyword Last Value 
a   5  0.4 
b   3  0.5 
c   5  0.3 
d   5  0.4 

Nie mogę powiedzieć, który wskaźnik zmienić.

Dzięki.

Odpowiedz

3
DF <- read.table(text="Keyword 1 2 3 4 5 
a  0.7 NA NA 0.3 0.4 
b   NA NA 0.5 NA NA 
c   NA 0.2 NA NA 0.3 
d   NA NA NA 0.3 0.4 
e   NA NA NA NA NA", header=TRUE) 

setNames(
    data.frame(DF[,1], 
      t(apply(DF[-1], 1, function(x) { 
       ind <- which(!is.na((x)))[1] 
       c(ind, x[ind]) 
      })) 
), c("Keyword", "First", "Value")) 
# Keyword First Value 
#1  a  1 0.7 
#2  b  3 0.5 
#3  c  2 0.2 
#4  d  4 0.3 
#5  e NA NA 
+0

właśnie delegowania dokładnie to samo rozwiązanie ... Dlaczego jednak dodałeś wiersz 'e'? –

+0

@DavidArenburg Aby zilustrować sprawę, OP nie zawierał przykładu. – Roland

+0

Rozwiązanie działało cuda. Co jeśli chcę ostatnią wartość? – Cinji18

0

Oto jeden inny sposób to zrobić przy użyciu data.table

#Set object as data.table object 
require(data.table) 
setDT(DF) 

Można użyć .SD aby przechodzić każdej wartości każdego wiersza

DF[ , .(First=which(!is.na(.SD))[1],Value=c(.SD)[which(!is.na(.SD))[1]]), by=Keyword] 

# Keyword First Value 
# 1:  a  1 0.7 
# 2:  b  3 0.5 
# 3:  c  2 0.2 
# 4:  d  4 0.3 
# 5:  e NA NULL 
Powiązane problemy