R - 如何索引排名并相应地显示数据框?

时间:2017-06-05 11:21:32

标签: r sorting dataframe ranking

我有一个数据框,列出了以美元进行的个人姓名及其货币交易。该表列出了根据几个地区的数据和现金或信用卡的有效交易,如下:

X    Dist    transact.cash    transact.card
a    1       USD              USD
b    1       USD              USD

如果X是个人,并且他/她的交易在一段时间内保持固定,Dist是他/她居住的地区。总计有超过4000个观测值。每{80}行Dist。到目前为止,排序,切片和其他一切都是简单的操作,dat.cashdat.card是根据事务模式的子集化表;但是在提取有关数据集排名的信息时我遇到了问题。为此,我编写了一个函数,我在其中指定了一个排名,函数应该显示从该排名开始的那些行:

rankdat <- function(transact, numb) {
               # Truncated
                 valid.nums = c('highest', 'lowest', 1:nrow(dat.cash)) # for cash subset
                     if (transact == 'cash' && numb == 'highest') { # This is easy
                 sort <- dat.cash[order(dat.cash[, 3], decreasing = T), ]# For sorting only cash data set
                  } else if (transact == 'cash' and numb == 1:nrow(dat.cash)) { 
                 sort <- dat.cash[order(dat.cash[, 3], decreasing = T) == numb, ] } # Not getting results here
                 }

最后一行是返回NULL而不是排名的事务及其所有行。将==替换为%in%仍然会NULL,使用rank()不会改变任何内容。对于highestlowest数字,它不是很多,因为它只涉及简单的排序。如果我指定rankdat('cash', 10),则该函数应返回从第10个最高事务开始的值,并且不管Dist而减少,类似于:

 X    Dist    transact.cash
 b    1       10th highest
 h    2       11th highest
 p    1       12th highest
 and  so      on

2 个答案:

答案 0 :(得分:0)

假设您有以下data.frame:

netstandard1.4

我们获得:

df=data.frame(X=c(rep('A',2),rep('B',3),rep('A',3),rep('B',2)),
               Dist=c(rep(1,5),rep(0,5)),
               transact.cash=c(rep('USD',5),rep('€',5)),
               transact.card=c(rep('USD',5),rep('€',5)))

如果您想对包含多个列 X Dist transact.cash transact.card 1 A 1 USD USD 2 A 1 USD USD 3 B 1 USD USD 4 B 1 USD USD 5 B 1 USD USD 6 A 0 € € 7 A 0 € € 8 A 0 € € 9 B 0 € € 10 B 0 € € transact.cash的数据框进行排序,则可以使用stackoverflow : How to sort a dataframe by column(s)。在您的示例中,您只指定了transact.cash,因此:

dat.cash

如果要提取与特定语句相关的行,则需要使用sort = df[order(df$transact.cash, decreasing=T),] # Order your dataFrame with transact.cash column which()进行数字,双精度匹配或==进行字符串匹配。例如:

%in%

最后,如果您想在订购后选择前五行:

XA = df[which(df$X %in% "A"),] # Select row by user
XDist = df[which(df$Dist == 1),] # Select row by District

通过它,您可以执行一个简单的功能,轻松地从数据框中提取数据。

希望它能帮到你

答案 1 :(得分:0)

此功能可以做到:

rankdat <- function(df,rank.by,num=10,method="top",decreasing=T){
  # ------------------------------------------------------
  # RANKDAT
  # ------------------------------------------------------
  # ARGUMENT 
  # ========
  # df        Input dataFrame [d.f]
  # num       Selected row [num]
  # rank.by   Name of column(s) used to rank dataFrame
  # method    Method used to extract rows
  #             top - to select top rank (e.g. 10 first rows)
  #             specific - to select specific row
  # ------------------------------------------------------
  eval(parse(text=paste("sort=df[with(df,order(",rank.by,"), decreasing=",decreasing,"),]",sep=""))) # order dataFrame by 
  if(method %in% "top"){
    return(sort[1:num,])
  }else if(method %in% "specific"){
    return(sort[num,])
  }else{
    stop("Please select method used to extract data !!!")
  }
}