2014-10-18 6 views
1

В моем фрейме данных df Я хочу получить номер id, удовлетворяющий условию, что значение A больше, чем значение B. В примере мне нужен Id = 2.сохранить значения столбца кадра данных R

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:

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

+1! переименуйте в широкий формат - это путь сюда! – agstudy

+0

Или используйте библиотеку (tidyr); df%>% spread (имя, значение); чтобы получить первую часть. – KFB

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"]
Смежные вопросы