2012-06-01 30 views
2

好日子長的數據格式工作,與R中

d <- c(1,1,1,2,2,2,3,3,3) 
e <- c(5,6,7,5,6,7,5,6,7) 
f <- c(0,0,1,0,1,0,0,0,1) 
df <- data.frame(d,e,f) 

我有數據看起來就像上面。我需要做的是爲每個d的唯一元素找到f中的第一個非零值,並在e中找到相應的值。具體而言,我想要另一個向量g,所以它看起來像這樣:

d <- c(1,1,1,2,2,2,3,3,3) 
e <- c(5,6,7,5,6,7,5,6,7) 
f <- c(0,0,1,0,1,0,0,0,1) 
g <- c(7,7,7,6,6,6,7,7,7) 
df <- data.frame(d,e,f,g) 

建議這麼做很容易?我以爲我可以使用split(),但在分割後使用which()時遇到了問題。我可以用AVE這樣的:

foo <- function(x){which(x>0)[1]} 
df$t <- ave(df$f,df$d,FUN=foo) 

但我無法找到e值。任何幫助表示讚賞。

回答

4

別人能提供一個基礎R解決方案,但這裏有一個辦法做到這一點使用plyr

> ddply(df,.(d),transform,g = head(e[f != 0],1)) 
    d e f g 
1 1 5 0 7 
2 1 6 0 7 
3 1 7 1 7 
4 2 5 0 6 
5 2 6 1 6 
6 2 7 0 6 
7 3 5 0 7 
8 3 6 0 7 
9 3 7 1 7 

請注意,我把你的筆記對「第一非零元素」從字面上看,即使你示例數據在列中只有一個唯一的非零元素(按組)。

2

這裏是在基礎R的方式

g <- inverse.rle(list(lengths=rle(d)$lengths, values=e[f != 0]))