2014-10-18 80 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"]