2013-04-26 75 views
12

我試圖計算每個因子水平的數字列的最小值,同時在結果數據框中保留另一因子的值。按因子水平合計,在結果數據框中保留其他變量

# dummy data 
dat <- data.frame(
    code = c("HH11", "HH45", "JL03", "JL03", "JL03", "HH11"), 
    index = c("023434", "3377477", "3388595", "3377477", "1177777", "023434"), 
    value = c(24.1, 37.2, 78.9, 45.9, 20.0, 34.6) 
    ) 

我想要的結果是對的code每級的最小的value,保持index中所得到的數據幀。

# result I want: 
# code value index 
# 1 HH11 24.1 023434 
# 2 HH45 37.2 3377477 
# 3 JL03 20.0 1177777 


# ddply attempt 
library(plyr) 
ddply(dat, ~ code, summarise, val = min(value)) 
# code val 
# 1 HH11 24.1 
# 2 HH45 37.2 
# 3 JL03 20.0 


# base R attempt 
aggregate(value ~ code, dat, min) 
# code value 
# 1 HH11 24.1 
# 2 HH45 37.2 
# 3 JL03 20.0 

回答

12

你需要對aggregate結果和原來使用mergedata.frame

merge(aggregate(value ~ code, dat, min), dat, by = c("code", "value")) 
## code value index 
## 1 HH11 24.1 023434 
## 2 HH45 37.2 3377477 
## 3 JL03 20.0 1177777 
+0

打敗我秒! – Chris 2013-04-26 01:24:50

0

好了,幾分鐘的搜索會變得有我...... this answer似乎這樣的伎倆:

merge(dat,aggregate(value_code,dat,min))

3

只是爲了表明總有多個途徑皮膚貓:

使用ave拿到最低行的指標各組:

dat[which(ave(dat$value,dat$code,FUN=function(x) x==min(x))==1),] 

# code index value 
#1 HH11 023434 24.1 
#2 HH45 3377477 37.2 
#5 JL03 1177777 20.0 

這種方法也有多種的情況下返回每code組多行的潛在益處值是最小值。

並採用by另一種方法:

do.call(rbind, 
    by(dat, dat$code, function(x) cbind(x[1,c("code","index")],value=min(x$value))) 
) 
#  code index value 
# HH11 HH11 023434 24.1 
# HH45 HH45 3377477 37.2 
# JL03 JL03 3388595 20.0 
0

如果您在會做指標變量又增加了。

library(plyr) 

# ddply 
ddply(dat, .(code,index), summarise, val = min(value)) 

# base R 
aggregate(value ~ code + index, dat, min) 
1

隨着dplyrdata.table包,你可以做到以下幾點。您可以獲得每個組具有最小值的行的索引。如果您使用dplyr,則可以在slice()中使用。如果使用data.table,則可以使用.SD實現相同的子集。

library(dplyr) 
library(data.table) 

dat %>% 
group_by(code) %>% 
slice(which.min(value)) 

# code index value 
# <fctr> <fctr> <dbl> 
#1 HH11 023434 24.1 
#2 HH45 3377477 37.2 
#3 JL03 1177777 20.0 

setDT(dat)[, .SD[which.min(value)], by = code] 

# code index value 
#1: HH11 023434 24.1 
#2: HH45 3377477 37.2 
#3: JL03 1177777 20.0 
相關問題