user_012314112
user_012314112

Reputation: 344

keep values of a data frame column R

In my data frame df I want to get the id number satisfying the condition that the value of A is greater than the value of B. In the example I only would want 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
}

Upvotes: 1

Views: 538

Answers (2)

miles2know
miles2know

Reputation: 747

The first answer works out well for sure. I wanted to get to regular subset operations as well. I came up with this since you might want to check out some of the more recent R packages. If you had 3 groups to compare that would be interesting. Oh in the code below exp is the exact data.frame you started with.

    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"] 

Upvotes: 3

josliber
josliber

Reputation: 44340

First, you could convert your data from long to wide so you have one row for each 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

Now you can use normal indexing to get the ids with larger A than B:

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

Upvotes: 4

Related Questions