2014-10-18 83 views
1

在我的數據框中df我想要得到的id數字滿足條件,即A的值大於B的值。在示例中,我只想要Id = 2。保留數據幀列的值

Id Name Value 
1 A 3 
1 B 5 
1 C 4 
2 A 7 
2 B 6 
2 C 8 

vecA<-vector(); 
vecB<-vector(); 
vecId<-vector(); 
i<-1 
while(i<=length(dim(df)[1]){ 
    if(df$Name[[i]]=="A"){vecA<-c(vecA,df$Value)} 
    if(df$Name[[i]]=="B"){vecB<-c(vecB,df$Value)} 
    if(vecA[i]>vecB[i]){vecId<-c(vecId,)} 
    i<-i+1 
} 

回答

4

首先,你可以從長轉換你的數據寬,所以你必須爲每個ID一行:

library(reshape2) 
(wide <- dcast(df, Id~Name, value.var="Value")) 
# Id A B C 
# 1 1 3 5 4 
# 2 2 7 6 8 

現在你可以使用正常的索引與大於B A點的ID:

wide$Id[wide$A > wide$B] 
# [1] 2 
+0

+1!重塑到廣泛的格式是去這裏的路! – agstudy 2014-10-18 00:40:21

+0

或使用庫(tidyr); df%>%spread(名稱,值);獲得第一部分。 – KFB 2014-10-18 01:56:37

3

第一個答案肯定會奏效。我也希望進行常規的子集操作。我想出了這個,因爲你可能想看看一些更新的R包。如果你有3組比較,這將是有趣的。哦,在下面的代碼exp是您開始使用的確切data.frame。

library(plyr) 
    library(dplyr) 

    comp <- exp %>% filter(Name %in% c("A","B")) %>% group_by(Id) %>% filter(min_rank(Value)>1) 

    # If the whole row is needed 
    comp[which.max(comp$Value),] 

    # If not 

    comp[which.max(comp$Value),"Id"]