R 对表循环中的行重新排序
我想更改循环中每个输出表中的行顺序 我目前正在使用R 对表循环中的行重新排序,r,R,我想更改循环中每个输出表中的行顺序 我目前正在使用lappy和dcast来获得一组表,我尝试在列表中设置所需的顺序,然后在列表中使用match()实现新的顺序 以下是我正在尝试的: #Setup data mtcars1 <- head(mtcars, 10) mtcars1$model <- rownames(mtcars1) df <- dplyr::bind_rows(mtcars1, mtcars1, mtcars1) df$year <- c(1975, 198
lappy
和dcast
来获得一组表,我尝试在列表中设置所需的顺序,然后在列表中使用match()
实现新的顺序
以下是我正在尝试的:
#Setup data
mtcars1 <- head(mtcars, 10)
mtcars1$model <- rownames(mtcars1)
df <- dplyr::bind_rows(mtcars1, mtcars1, mtcars1)
df$year <- c(1975, 1983)
df$class <- c(2,2,2,3,3,3,4,4,4,4,2,2,2,3,3)
#Create set of tables
tables <- lapply(split(df, df$cyl),
FUN = function(d) reshape2::dcast(model + class ~ year,
value.var = "year", length , data = df))
tables
#My output has the rows arranged according to model alphabetical order, like this:
model class 1975 1983
1 Datsun 710 2 2 0
2 Datsun 710 4 1 0
3 Duster 360 2 2 0
4 Duster 360 4 1 0
5 Hornet 4 Drive 3 0 2
6 Hornet 4 Drive 4 0 1
7 Hornet Sportabout 3 2 0
8 Hornet Sportabout 4 1 0
9 Mazda RX4 2 2 0
10 Mazda RX4 3 1 0
11 Mazda RX4 Wag 2 0 2
12 Mazda RX4 Wag 4 0 1
13 Merc 230 3 2 0
14 Merc 230 4 1 0
15 Merc 240D 2 0 2
16 Merc 240D 4 0 1
17 Merc 280 3 0 2
18 Merc 280 4 0 1
19 Valiant 2 0 2
20 Valiant 3 0 1
我目前正在尝试的是:
#Reorder col1 names as desired
target <- c("Datsun 710", "Duster 360", "Hornet Sportabout", "Mazda RX4" , "Mazda RX4 Wag" ,
"Merc 230", "Merc 240D", "Merc 280", "Valiant", "Hornet 4 Drive")
table2 <- lapply(table1, FUN = function(x)
x[match(target, x$model), ])
table2
model class 1975 1983
1 Datsun 710 2 2 0
3 Duster 360 2 2 0
7 Hornet Sportabout 3 2 0
9 Mazda RX4 2 2 0
11 Mazda RX4 Wag 2 0 2
13 Merc 230 3 2 0
15 Merc 240D 2 0 2
17 Merc 280 3 0 2
19 Valiant 2 0 2
5 Hornet 4 Drive 3 0 2
#根据需要对col1名称重新排序
target如果我理解正确,那么问题是你“想把“大黄蜂4驱”模型放在桌子的末尾”。下面是一个示例,说明如何做到这一点:
df <- data.frame(num= 1:8, name= c("a", "a", "b", "b", "b", "c", "c", "d"), stringsAsFactors = FALSE)
name_last <- "b"
df <- rbind.data.frame(df[df$name != name_last, ], df[df$name == name_last, ])
df
num name
1 1 a
2 2 a
6 6 c
7 7 c
8 8 d
3 3 b
4 4 b
5 5 b
df这应该是您正在寻找的:
tables_reordered<-lapply(tables, function (x) {rbind(x[which(!x$model=="Hornet 4 Drive"),], x[which(x$model=="Hornet 4 Drive"),])})
表格\u重新排序或者,这可以通过强制模型
到因子,使用forcats::fct\u relevel()
重新排列因子级别,并按因子级别排序来解决
lapply(tables, function(x) {
x[order(forcats::fct_relevel(x$model, "Hornet 4 Drive", after = Inf)), ]
})
请写下你使用的所有软件包。这样可以更快地运行代码。
lapply(tables, function(x) {
x[order(forcats::fct_relevel(x$model, "Hornet 4 Drive", after = Inf)), ]
})
$`4`
model class 1975 1983
1 Datsun 710 2 2 0
2 Datsun 710 4 1 0
3 Duster 360 2 2 0
4 Duster 360 4 1 0
7 Hornet Sportabout 3 2 0
8 Hornet Sportabout 4 1 0
9 Mazda RX4 2 2 0
10 Mazda RX4 3 1 0
11 Mazda RX4 Wag 2 0 2
12 Mazda RX4 Wag 4 0 1
13 Merc 230 3 2 0
14 Merc 230 4 1 0
15 Merc 240D 2 0 2
16 Merc 240D 4 0 1
17 Merc 280 3 0 2
18 Merc 280 4 0 1
19 Valiant 2 0 2
20 Valiant 3 0 1
5 Hornet 4 Drive 3 0 2
6 Hornet 4 Drive 4 0 1
$`6`
model class 1975 1983
1 Datsun 710 2 2 0
2 Datsun 710 4 1 0
3 Duster 360 2 2 0
4 Duster 360 4 1 0
7 Hornet Sportabout 3 2 0
8 Hornet Sportabout 4 1 0
9 Mazda RX4 2 2 0
10 Mazda RX4 3 1 0
11 Mazda RX4 Wag 2 0 2
12 Mazda RX4 Wag 4 0 1
13 Merc 230 3 2 0
14 Merc 230 4 1 0
15 Merc 240D 2 0 2
16 Merc 240D 4 0 1
17 Merc 280 3 0 2
18 Merc 280 4 0 1
19 Valiant 2 0 2
20 Valiant 3 0 1
5 Hornet 4 Drive 3 0 2
6 Hornet 4 Drive 4 0 1
$`8`
model class 1975 1983
1 Datsun 710 2 2 0
2 Datsun 710 4 1 0
3 Duster 360 2 2 0
4 Duster 360 4 1 0
7 Hornet Sportabout 3 2 0
8 Hornet Sportabout 4 1 0
9 Mazda RX4 2 2 0
10 Mazda RX4 3 1 0
11 Mazda RX4 Wag 2 0 2
12 Mazda RX4 Wag 4 0 1
13 Merc 230 3 2 0
14 Merc 230 4 1 0
15 Merc 240D 2 0 2
16 Merc 240D 4 0 1
17 Merc 280 3 0 2
18 Merc 280 4 0 1
19 Valiant 2 0 2
20 Valiant 3 0 1
5 Hornet 4 Drive 3 0 2
6 Hornet 4 Drive 4 0 1