2015-02-07 67 views
3

內秩我有這樣一個數據幀(DF)這僅僅是一個示例:R-新的變量根據組

group value condition 
1  12  1 
1  14  1 
1  18  1 
1  10  0 
1  7  1 
2  12  1 
2  9  0 
2  12  1 
2  16  1 
2  15  0 

即;

df<-data.frame(group=c(1,1,1,1,1,2,2,2,2,2), value=c(12,14,18,10,7,12,9,12,16,15), condition=c(1,1,1,0,1,1,0,1,1,0)) 

我要創建3個名爲新colums 「等級-1」, 「秩2」 和 「rank3」 裏

  • 秩1給出了 「羣」 S
  • 秩2中最小的 「值」給出了「組」 S
  • rank3給出了「基團」中的第三最小的「值」 S
  • 值內,其中條件= 1成立內的第二最小的「值」

即,期望的輸出是:

group rank1 rank2 ran3 
1  7  12 14 
2  12 12 16 

我怎樣才能做到這一點,其中R?我會很樂意提供任何幫助。非常感謝。

回答

5

隨着data.table

library(data.table) 
setDT(df)[condition == 1, 
      setNames(as.list(sort(value)[1:3]), paste0("rank", 1:3)), 
      by = group] 
# group rank1 rank2 rank3 
# 1:  1  7 12 14 
# 2:  2 12 12 16 
+0

您快速:) – 2015-02-07 19:15:16

+0

@Josh O'Brien,我通過添加條件來編輯問題。非常感謝。 – oercim 2015-02-07 19:17:21

+0

@oercim - 啊,是的,謝謝! – 2015-02-07 20:23:28

2

下面是使用dplyr/tidyr

library(dplyr) 
library(tidyr) 
df %>% 
    group_by(group) %>% 
    filter(condition!=0) 
    arrange(value) %>% 
    slice(1:3) %>% 
    mutate(n=paste0('rank', row_number())) %>% 
    select(-condition) 
    spread(n, value) 
# group rank1 rank2 rank3 
#1  1  7 12 14 
#2  2 12 12 16 

或單向使用data.table

library(data.table) 
dcast.data.table(setkey(setDT(df), value)[condition!=0, 
    list(rank=paste0('rank', 1:3), value[1:3]), group], 
      group~rank, value.var='V2') 
# group rank1 rank2 rank3 
#1:  1  7 12 14 
#2:  2 12 12 16 

或者使用base R

df1 <- subset(df[order(df$value),], condition!=0 , select=1:2) 
df2 <- subset(transform(df1, .id=ave(group, group, FUN=seq_along)), .id<4) 
reshape(df2, idvar='group', timevar='.id', direction='wide') 
# group value.1 value.2 value.3 
#5  1  7  12  14 
#6  2  12  12  16 
+0

我通過添加條件編輯的問題。非常感謝。 – oercim 2015-02-07 19:17:38

+0

@oercim編輯瞭解決方案 – akrun 2015-02-07 19:21:12

+0

我使用了data.table。它工作得很好。再次感謝。我很感激。 – oercim 2015-02-07 19:26:16

1

另一個dplyr答案...

myData <- read.csv(text=" group,value  
1,12 
1,14 
1,18 
1,10 
1,7 
2,12 
2,9 
2,12 
2,16 ") 

library(dplyr) 
myData %>% filter(condition==1) %>% group_by(group) %>% summarise(rank1=nth(sort(value),1), 
             rank2=nth(sort(value),2), 
             rank3=nth(sort(value),3)) 
+0

我通過添加一個條件編輯了問題。非常感謝。 – oercim 2015-02-07 19:18:09

+0

從dplyr添加過濾器() – Jthorpe 2015-02-07 19:19:53