2015-10-29 41 views
0

我有數據集通話df,像這樣:返回最大的幾個數字作爲一個數據幀列表中的R

Title Time Gross 
a  12/21 2313 
b  11/12 1298 
c  4/09 10034 
d  09/30 3498 
e  10/31 2375 
y  01/10 8492 

我想編寫一個函數,用最大的Gross回到3項的TitleGross
我想是這樣的:

names.revenues <- function(num, data){ 
    i = 1 
    for(i in 1:num){ 
    inds = which.max(data$Gross) 
    names[i] = data$Title[inds] 
    revenues[i] = data$Gross[inds] 
    data = data[-inds, ] 
    i = i + 1 
    } 
    return(list(names = names, revenues = revenues)) 
} 
names.revenues(3, df) 

但是,這並不工作,請給我一個提示。謝謝!

+0

請您提供一個示例數據集,以便您有一個[可重現的示例樂](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? – cocquemas

+0

我改變了問題,謝謝。 –

+0

'head(df [order(-df $ Gross),],3)'?或者使用'data.table'也許'library(data.table); setDT(DF)[順序(-Gross)] [1:3]'? –

回答

2

你的函數有一些錯誤,這裏是一個可能的工作版本:

names.revenues <- function(num, data){ 
    # initialize names and revenues with NAs 
    names <- rep.int(NA,num) 
    revenues <- rep.int(NA,num) 

    for(i in 1:num){ 
    inds = which.max(data$Gross) 
    names[i] = data$Title[inds] 
    revenues[i] = data$Gross[inds] 
    data = data[-inds, ] 
    } 
    return(list(names = names, revenues = revenues)) 
} 

例子:

df <- data.frame(Title=letters[1:10], 
       Time=format(format='%m/%d',Sys.Date()+1:10), 
       Gross=c(10,200,40,500,70,500,20,300,10,50), 
       stringsAsFactors=FALSE) 
# > df 
# Title Time Gross 
# 1  a 10/30 10 
# 2  b 10/31 200 
# 3  c 11/01 40 
# 4  d 11/02 500 
# 5  e 11/03 70 
# 6  f 11/04 500 
# 7  g 11/05 20 
# 8  h 11/06 300 
# 9  i 11/07 10 
# 10  j 11/08 50 

res1 <- names.revenues(5, df) 
# > res 1 
# $names 
# [1] "d" "f" "h" "b" "e" 
# 
# $revenues 
# [1] 500 500 300 200 70 

但能夠獲得基本符合這個(更有效)的一行相同的結果:

res2 <- head(df[order(df$Gross,decreasing=TRUE),],5) 
# > res2 
# Title Time Gross 
# 4  d 11/02 500 
# 6  f 11/04 500 
# 8  h 11/06 300 
# 2  b 10/31 200 
# 5  e 11/03 70 
+0

所以,我需要在創作之前爲名字和收入創建矢量。在,對嗎? –

+0

是的,在這種情況下,我預先分配了它,因爲我事先知道向量的長度,但在其他情況下,您可以初始化爲「NULL」,然後附加到它,例如'v < - NULL'然後'v < - c(v,value2append)' – digEmAll

+0

我可以使用名稱< - c(length = num)來創建一個空向量嗎? –

相關問題