我有一个3列(name,, )的数据框y,sex其中name是字符,y是一个数值,sex是一个因子.
sex<-c("M","M","F","M","F","M","M","M","F")
x<-c("MARK","TOM","SUSAN","LARRY","EMMA","LEONARD","TIM","MATT","VIOLET")
name<-as.character(x)
y<-rnorm(9,8,1)
score<-data.frame(x,y,sex)
score
name y sex
1 MARK 6.767086 M
2 TOM 7.613928 M
3 SUSAN 7.447405 F
4 LARRY 8.040069 M
5 EMMA 8.306875 F
6 LEONARD 8.697268 M
7 TIM 10.385221 M
8 MATT 7.497702 M
9 VIOLET 10.177969 F
Run Code Online (Sandbox Code Playgroud)
如果我想订购,y我会使用:
score[order(score$y),]
x y sex
1 MARK 6.767086 M
3 SUSAN 7.447405 F
8 MATT 7.497702 M
2 TOM …Run Code Online (Sandbox Code Playgroud) 我有一个数据框full,我想从中获取最后一列和一列v.然后我想以v最快的方式对两列进行排序.full从csv读入,但这可以用于测试(包括一些现实主义的NA):
n <- 200000
full <- data.frame(A = runif(n, 1, 10000), B = floor(runif(n, 0, 1.9)))
full[sample(n, 10000), 'A'] <- NA
v <- 1
Run Code Online (Sandbox Code Playgroud)
我在v这里有一个,但实际上它可以改变,并full有很多专栏.
我尝试过对数据框,数据表和矩阵进行排序order和sort.list(从这个线程中获取一些想法).所有这些的代码:
# DATA FRAME
ord_df <- function() {
a <- full[c(v, length(full))]
a[with(a, order(a[1])), ]
}
sl_df <- function() {
a <- full[c(v, length(full))]
a[sort.list(a[[1]]), ]
}
# DATA TABLE
require(data.table)
ord_dt <- function() {
a <- …Run Code Online (Sandbox Code Playgroud) 我试图测量R中函数的计算时间system.time().我想运行该函数几百次以获得平均值,但我不想复制和粘贴那么多次.有更简单的方法吗?
我有一个类似于此的数据集
User Date Value
A 2012-01-01 4
A 2012-01-02 5
A 2012-01-03 6
A 2012-01-04 7
B 2012-01-01 2
B 2012-01-02 3
B 2012-01-03 4
B 2012-01-04 5
Run Code Online (Sandbox Code Playgroud)
我想创造一个Value尊重的滞后User.
User Date Value Value.lag
A 2012-01-01 4 NA
A 2012-01-02 5 4
A 2012-01-03 6 5
A 2012-01-04 7 6
B 2012-01-01 2 NA
B 2012-01-02 3 2
B 2012-01-03 4 3
B 2012-01-04 5 4
Run Code Online (Sandbox Code Playgroud)
我在循环中做得非常低效
df$value.lag1<-NA
levs<-levels(as.factor(df$User))
levs
for (i in 1:length(levs)) {
temper<- subset(df,User==as.numeric(levs[i])) …Run Code Online (Sandbox Code Playgroud) 可能重复:
如何按R中的列对数据帧进行排序
这是数据集:
odervect <- c("xaf", "c3a", "c3b", "ka101","jk12", "cd101", "kl01v", "klm1")
odervect
[1] "xaf" "c3a" "c3b" "ka101" "jk12" "cd101" "kl01v" "klm1"
dfd <- data.frame(ka101 = 101:110,c3a = 1:10, kl01v = 301:310, xaf = 11:20,
c3b = 41:50, cd101 = 61:70)
dfd
ka101 c3a kl01v xaf c3b cd101
1 101 1 301 11 41 61
2 102 2 302 12 42 62
3 103 3 303 13 43 63
4 104 4 304 14 44 64
5 105 5 305 …Run Code Online (Sandbox Code Playgroud) 我希望data.frame按多列排序,理想情况下使用基本R而不使用任何外部包(尽管如果必要,也可以这样).阅读了如何按列对数据框进行排序?,我知道order()只要我这样做,我就能用这个功能完成这个:
但是,如果我只有一个包含多个列名的向量,其长度是事先未知的呢?
说矢量被调用sortnames.
data[order(data[, sortnames]), ]将无法工作,因为order()将其视为单个排序参数.
data[order(data[, sortnames[1]], data[, sortnames[2]], ...), ] 当且仅当我指定了sortname值的确切正确数量时才会工作,我不会事先知道.
我看过的但并不完全满意的事情:
eval(parse(text=paste("data[with(data, order(", paste(sortnames, collapse=","), ")), ]"))).也许这很好,但我看到很多人讨厌使用eval(),所以要求替代品似乎是值得的.Deducer库来实现这一点sortData(),但就像我说的,我宁愿避免使用外部包.如果我对不使用外包装太顽固,请告诉我.我会挺过来的.所有想法提前赞赏!
我终于决定将在互联网上浮动的sort.data.frame方法放入R包中.它只是被要求太多而无法留给临时分发方法.
但是,它使用参数编写,使其与泛型排序函数不兼容:
sort(x,decreasing,...)
sort.data.frame(form,dat)
Run Code Online (Sandbox Code Playgroud)
如果我sort.data.frame改为将减少作为参数sort.data.frame(form,decreasing,dat)并且丢弃减少,那么它就会失去它的简单性,因为你总是必须指定dat=并且不能真正使用位置参数.如果我将其添加到最后sort.data.frame(form,dat,decreasing),则顺序与泛型函数不匹配.如果我希望减少被赶上点`sort.data.frame(form,dat,...),那么当使用基于位置的匹配时,我相信泛型函数会将第二个位置分配给减少,它会得到丢弃.协调这两个功能的最佳方法是什么?
完整的功能是:
# Sort a data frame
sort.data.frame <- function(form,dat){
# Author: Kevin Wright
# http://tolstoy.newcastle.edu.au/R/help/04/09/4300.html
# Some ideas from Andy Liaw
# http://tolstoy.newcastle.edu.au/R/help/04/07/1076.html
# Use + for ascending, - for decending.
# Sorting is left to right in the formula
# Useage is either of the following:
# sort.data.frame(~Block-Variety,Oats)
# sort.data.frame(Oats,~-Variety+Block)
# If dat is the formula, then switch form and dat
if(inherits(dat,"formula")){
f=dat
dat=form
form=f
} …Run Code Online (Sandbox Code Playgroud) 我很好奇为什么排列功能不会按字母顺序工作,但不能反向按字母顺序排列.
df <- data.frame(string = as.character(c("b", "a", "c")), stringsAsFactors = F)
df %>% arrange(string) #works
df %>% arrange(-string) #does not work
Run Code Online (Sandbox Code Playgroud)
我只是使用完全错误的方法来实现我想要完成的任务吗?
我遇到了一个应用程序,我需要按列号对data.frame进行排序,而且通常的解决方案似乎都不允许这样做.
上下文正在创建一个as.data.frame.by方法.由于by对象将其最后一列作为值列,而将第一列ncol-1列作为索引列. melt返回它向后排序 - 索引3,然后索引2,然后索引1.为了兼容latex.table.by我想要向前排序.但是我在以足够通用的方式做这件事时遇到了麻烦.下面函数中注释掉的行是迄今为止我最好的尝试.
as.data.frame.by <- function( x, colnames=paste("IDX",seq(length(dim(x))),sep="" ), ... ) {
num.by.vars <- length(dim(x))
res <- melt(unclass(x))
res <- na.omit(res)
colnames(res)[seq(num.by.vars)] <- colnames
#res <- res[ order(res[ , seq(num.by.vars)] ) , ] # Sort the results by the by vars in the heirarchy given
res
}
dat <- transform( ChickWeight, Time=cut(Time,3), Chick=cut(as.numeric(Chick),3) )
my.by <- by( dat, with(dat,list(Time,Chick,Diet)), function(x) sum(x$weight) )
> as.data.frame(my.by)
IDX1 IDX2 IDX3 value
1 …Run Code Online (Sandbox Code Playgroud) 有谁知道如何用R绝对值对矢量进行排序,(-2, 3, 1) -> (1, -2, 3)等等?
如果我在python中这样做,我会创建一对每个值及其符号,按绝对值对对列表进行排序然后重新应用符号,但我对R很新,所以不知道如何做到这一点.
干杯
r ×10
sorting ×3
benchmarking ×1
class ×1
data.table ×1
dataframe ×1
dplyr ×1
function ×1
generics ×1
lag ×1
methods ×1
r-factor ×1
time-series ×1