2013-02-13 74 views
3

例如第一行創建條目列,如果我有這樣的數據:的R - 僅適用於每個子集

ID Value 
1 2 
1 2 
1 3 
1 4 
1 10 
2 9 
2 9 
2 12 
2 13 

而我的目標是要找到每個ID子集的最小值,我想數是ID組的第一行中,同時使其他行的空白,使得:

ID Value Start 
1 2  2 
1 2  
1 3  
1 4  
1 10  
2 9  9 
2 9  
2 12  
2 13  

我的第一反應是創建使用

A <- transform(A, INDEX=ave(ID, ID, FUN=seq_along)) ## A being the name of my data 
爲ID的索引

因爲我是一個noob,所以我在這一點上卡住了。對於每個ID = n,我想找到該ID子集的min(A $ Value),並將其放入ID = n和INDEX = 1的單元匹配條件中。

任何幫助非常感謝!我很抱歉,我不斷地問問題:(

回答

3

這裏有一個解決方案:

within(A, INDEX <- "is.na<-"(ave(Value, ID, FUN = min), c(FALSE, !diff(ID)))) 

    ID Value INDEX 
1 1  2  2 
2 1  2 NA 
3 1  3 NA 
4 1  4 NA 
5 1 10 NA 
6 2  9  9 
7 2  9 NA 
8 2 12 NA 
9 2 13 NA 

更新:

它是如何工作命令ave(Value, ID, FUN = min)應用功能min到的每個子集Value沿着ID的值,例如,它返回五次的向量2和四次9因爲所有的值e除了每個子集中的第一個應爲NA,功能"is.na<-"將替換由c(FALSE, !diff(ID))定義的邏輯索引處的所有值。如果一個值與前一個值相同,則該索引是TRUE

+0

你能爲這個添加一點點解釋嗎?這是我的目標。 – 2013-02-13 12:26:45

+0

@Sven Hohenstein:這個解決方案效果更好!我的「價值」實際上是「日期」,格式爲%m /%d /%Y(我不想完全依賴他人)。另一種解決方案不適用於日期 - 它在某些日期選擇了錯誤的最小值和最大值。我認爲這是因爲R沒有將我的數據識別爲日期,但是在使用as.Date()後出現錯誤。然後我嘗試了你的方法,所有的日期都是正確的。謝謝! – shirleywu 2013-02-15 01:33:16

+0

@ sebastian-c我添加了一個解釋。 – 2013-02-15 02:31:54

2

你快到了。我們只需要製作一個自定義功能而不是seq_along,並將value分割爲ID(而不是ID,ID)。

first_min <- function(x){ 
    nas <- rep(NA, length(x)) 
    nas[which.min(x)] <- min(x, na.rm=TRUE) 
    nas 
} 

該功能的NA的向量和替換的Value最小值的第一個元素。

transform(dat, INDEX=ave(Value, ID, FUN=first_min)) 

## ID Value INDEX 
## 1 1  2  2 
## 2 1  2 NA 
## 3 1  3 NA 
## 4 1  4 NA 
## 5 1 10 NA 
## 6 2  9  9 
## 7 2  9 NA 
## 8 2 12 NA 
## 9 2 13 NA 
+0

感謝您的詳細解釋,這真的很有幫助。我不能使它在日期中工作良好,儘管 – shirleywu 2013-02-15 01:55:49

+0

你可以通過在'first_min'中產生NAs向量後插入一行來減輕這一點:if(inherits(x,「Date」))nas < - as.Date (nas)' – 2013-02-15 03:05:40

+0

你的意思是將它插入函數的最後? – shirleywu 2013-02-15 04:07:36

1

您可以用tapply一個班輪

df$Start<-as.vector(unlist(tapply(df$Value,df$ID,FUN = function(x){ return (c(min(x),rep("",length(x)-1)))}))) 
+0

這也適用於日期,它將空單元格留空! – shirleywu 2013-02-15 02:02:10

0

我總是要回這個問題,做到這一點和上面的答案,大大幫助了我。 有適合初學者鹼性溶液太:

A$Start<-NA A[!duplicated(A$ID),]$Start<-A[!duplicated(A$ID),]$Value

感謝。