R:返回的第一个元素和位置数据帧

问题描述:

我有一个数据帧像这样的每一行:R:返回的第一个元素和位置数据帧

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 

我想获得它,这样的结果给我这个:

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

我该怎么做呢?

谢谢。


该解决方案创造了奇迹。

如果我想最后的价值是什么,这样的结果是这样的:

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

我不能告诉要更改的索引。

谢谢。

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

我只是张贴完全相同的解决方案...为什么你加了'e'行? – 2014-10-28 19:04:00

+0

@DavidArenburg为了说明OP在他们的例子中没有涉及的情况。 – Roland 2014-10-29 07:35:10

+0

解决方案创造了奇迹。如果我想要最后一个值怎么办? – Cinji18 2014-10-29 18:07:16

这里有一个其他方式使用data.table

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

做到这一点,您可以通过各行的值使用.SD循环

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