我想基于列中的值(字符)对R中的数据框进行半反向排序。
我有以下示例数据集:
# Sample data
df <- read.table(text="id value
cx-01 1
cx-01 2
cx-02 1
cx-02 2
cx-02 3
cx-03 1
cx-03 2
px-01 1
px-01 2
px-02 1
px-02 2
px-02 3
px-03 1
px-03 2
rx-01 1
rx-01 2
rx-02 1
rx-02 2
rx-02 3
rx-03 1
rx-03 2", header=TRUE)
预期输出:
id value
1 cx-03 2
2 cx-03 1
3 cx-02 3
4 cx-02 2
5 cx-02 1
6 cx-01 2
7 cx-01 1
8 rx-03 2
9 rx-03 1
10 rx-02 3
11 rx-02 2
12 rx-02 1
13 rx-01 2
14 rx-01 1
15 px-03 2
16 px-03 1
17 px-02 3
18 px-02 2
19 px-02 1
20 px-01 2
21 px-01 1
我尝试使用基数R的order()
函数,但遗憾的是没有成功。此外,我尝试使用plyr
包的ranging函数,但是,我没有设法按需要对数据进行排序。
是否可以根据自己提供的顺序(而不是按字母顺序)对第一列中的标签进行排序?
答案 0 :(得分:2)
我们可以arrange
分别对“ id”的数字和字母部分进行排序,并按desc
的结尾顺序排列“值”。字母部分似乎是自定义顺序,因此要么转换为指定了factor
的{{1}},要么按与预期获得索引相同的顺序使用levels
和match
以此顺序
vector
答案 1 :(得分:2)
使用基础with()
中的order()
和R
# sample data
df <- read.table(text="id value
cx-01 1
cx-01 2
cx-02 1
cx-02 2
cx-02 3
cx-03 1
cx-03 2
px-01 1
px-01 2
px-02 1
px-02 2
px-02 3
px-03 1
px-03 2
rx-01 1
rx-01 2
rx-02 1
rx-02 2
rx-02 3
rx-03 1
rx-03 2", header=TRUE, stringsAsFactors=F)
# create another data frame with variables to order on
col.ord <- data.frame(t(sapply(strsplit(df$id, "-"), print)), df$value, stringsAsFactors = F)
# reorder data frame
df[with(col.ord, order(X1, -as.integer(X2), -df.value)), ]
#> id value
#> 7 cx-03 2
#> 6 cx-03 1
#> 5 cx-02 3
#> 4 cx-02 2
#> 3 cx-02 1
#> 2 cx-01 2
#> 1 cx-01 1
#> 14 px-03 2
#> 13 px-03 1
#> 12 px-02 3
#> 11 px-02 2
#> 10 px-02 1
#> 9 px-01 2
#> 8 px-01 1
#> 21 rx-03 2
#> 20 rx-03 1
#> 19 rx-02 3
#> 18 rx-02 2
#> 17 rx-02 1
#> 16 rx-01 2
#> 15 rx-01 1
由reprex package(v0.2.1)于2019-04-27创建