对于具有任意列数的任意矩阵或数据框x,我想这样做:
x=x[order(x[,1], x[,2], ..., x[,ncol(x)]),]
Run Code Online (Sandbox Code Playgroud)
也就是说,我想按第一列排序,然后按第二列排序,...,然后按最后一列排序。这里关于排序的扩展讨论似乎不包含解决方案。这是我的解决方案,它违反了fortune(106):
sortarray = function(x){
k = ncol(x)
com = paste("x = x[order(x[,", paste(1:k, collapse = "],x[,"), "]),]", sep = "")
eval(parse(text = com))
return(x)}
x = sortarray(x)
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但是没有更干净的方法吗?
编辑重复数据删除澄清: 这个问题与建议的重复问题有很大不同(至少对我来说)。上一个问题涉及您明确指定要排序的列的情况。就我而言,我希望自动选择列(特别是所有列),而不是必须在排序命令中键入每个列名称。下面的答案解决了我的问题,与上一个问题的任何答案不同。
可能重复:
如何按R中的列对数据帧进行排序
我有一个如下所示的数据集:
x y z
1. 1 0.2
1.1 1 1.5
1.2 1 3.
1. 2 8.1
1.1 2 1.0
1.2 2 0.6
Run Code Online (Sandbox Code Playgroud)
我想要的是首先将数据集作为x的函数按递增顺序组织,然后作为y的函数来组织
x y z
1. 1 0.2
1. 2 8.1
1.1 1 1.5
1.1 2 1.
1.2 1 3.
1.2 2 0.6
Run Code Online (Sandbox Code Playgroud)
我知道apply,mapply,tapply等函数重新组织数据集,但我必须承认我并不真正理解它们之间的差异,也不知道如何应用哪些以及何时应用.
谢谢你的建议.
我有两个具有相同列数的数据帧.我正在编写一个函数,它将两个数据帧和一个整数n作为参数,并需要按每个数据集的第n列排序.基本上,我如何在第n列对数据框进行排序而不必知道该列的标签?
在R中,我在数据帧中有一堆数据,如:
state | zip | value
______|_______|______
CA | 94555 | 18
CA | 94556 | 5
OH | 12345 | 22
OH | 12346 | 10
Run Code Online (Sandbox Code Playgroud)
等等.
我希望在每一行中添加一列,列出该状态的平均"值".
我可以通过" (aggregate(data$value, list(State = data$state), mean))" 获得手段的数据框.这给了我一个50行的数据帧,每个状态一个.但是我需要回到原始数据框并将状态的平均值放在属于该状态的行中.
我该怎么做呢?
我在R中有以下数据框:
DataTable <- data.frame( Name = c("Nelle","Alex","Thomas","Jeff","Rodger","Michi"), Age = c(17, 18, 18, 16, 16, 16), Grade = c(1,5,3,2,2,4) )
Name Age Grade
1 Nelle 17 1
2 Alex 18 5
3 Thomas 18 3
4 Jeff 16 2
5 Rodger 16 2
6 Michi 16 4
Run Code Online (Sandbox Code Playgroud)
现在生病将按其Age列对该数据框进行排序.到目前为止没问题:
DataTable_sort_age <- DataTable[with(DataTable, order(DataTable[,2])),]
Name Age Grade
4 Jeff 16 2
5 Rodger 16 2
6 Michi 16 4
1 Nelle 17 1
2 Alex 18 5
3 Thomas 18 3 …Run Code Online (Sandbox Code Playgroud) 我执行以下代码:
df<-data.frame(word=c("play","win","offer","http"),frequency=c(321,355,123,564),type=c("nonspam","nonspam","spam","spam"))
df=arrange(df,desc(frequency),desc(type))
df=df[order(df[,2],df[,3]),]
Run Code Online (Sandbox Code Playgroud)
结果是:
word frequency type
4 offer 123 spam
3 play 321 nonspam
2 win 355 nonspam
1 http 564 spam
Run Code Online (Sandbox Code Playgroud)
但我想根据频率和类型对数据框进行排序,例如:
word frequency type
1 http 564 spam
4 offer 123 spam
2 win 355 nonspam
3 play 321 nonspam
Run Code Online (Sandbox Code Playgroud) 我想按多列对数据框进行排序。这是我制作的一个简单的数据框。如何按不同的排序类型对每一列进行排序?
using DataFrames
DataFrame(b = ("Hi", "Med", "Hi", "Low"),
levels = ("Med", "Hi", "Low"),
x = ("A", "E", "I", "O"), y = (6, 3, 7, 2),
z = (2, 1, 1, 2))
Run Code Online (Sandbox Code Playgroud)
从这里移植过来。
我有一份样本调查表; 人口统计学的东西.其中一列是country (factor)另一个annual income.现在,我需要计算每个国家的平均值并以新data.frame的country和相应的平均值存储.它应该很简单,但我迷路了.数据如下所示:
Country Income($) Education ... ... ...
1. USA 90000 Phd
2. UK 94000 Undergrad
3. USA 94000 Highschool
4. UK 87000 Phd
5. Russia 77000 Undergrad
6. Norway 60000 Masters
7. Korea 90000 Phd
8. USA 110000 Masters
.
.
Run Code Online (Sandbox Code Playgroud)
我需要一个最终结果,如:
USA UK Russia ...
98000 90000 75000
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在比较不同数据操作包在不同大小的数据集上对某些操作的执行情况。
我生成了一个虚拟数据集(iris x iris 的笛卡尔积。毫无意义,但本质上只是一个 22500 x 10 数据集)。
library(dplyr)
library(data.table)
library(rbenchmark)
iris_big <- merge(x = iris, y = iris, by = NULL)
iris_big_dt <- as.data.table(iris_big) #for data.table
benchmark("Base R" = {
iris_big[base::order("Petal.Width.y")]
},
"dplyr" = {
dplyr::arrange(iris_big,"Petal.Width.y")
},
"data.table" = {
data.table::setorder(iris_big_dt,"Petal.Width.y")
},
replications = 30,
columns = c("test", "replications", "elapsed",
"relative", "user.self", "sys.self"))
Run Code Online (Sandbox Code Playgroud)
输出::
| test | replications |elapsed|...|sys.self|
| -------- | -------------- |---- |---|---|
| Base R | 30 |0.00 |...|0.00|
| data.table | 30 |0.04 |...|0.02| …Run Code Online (Sandbox Code Playgroud)