我有一个数据框,列出了以美元进行的个人姓名及其货币交易。该表列出了根据几个地区的数据和现金或信用卡的有效交易,如下:
X Dist transact.cash transact.card
a 1 USD USD
b 1 USD USD
如果X是个人,并且他/她的交易在一段时间内保持固定,Dist
是他/她居住的地区。总计有超过4000个观测值。每{80}行Dist
。到目前为止,排序,切片和其他一切都是简单的操作,dat.cash
和dat.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()
不会改变任何内容。对于highest
和lowest
数字,它不是很多,因为它只涉及简单的排序。如果我指定rankdat('cash', 10)
,则该函数应返回从第10个最高事务开始的值,并且不管Dist
而减少,类似于:
X Dist transact.cash
b 1 10th highest
h 2 11th highest
p 1 12th highest
and so on
答案 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 !!!")
}
}