我有這樣一個資料框架:
data. frame( obs= c("A"/span>。 "B"。 "C", "D"。 "E"),
Var1 = c(3. 7, 7.8, 8. 9, 7.0, 3. 4),3.
Var2 = c(2. 7, 8.0, 1. 0, 1.0, 2。 0),2.
Var3 = c(9. 1, 1.5, 2. 7, 9.0, 5. 0))
為了按照我的需要排序,我是這樣做的:
rbind()
資料。 frame( obs= c("A"/span>。 "B"/span>。 "C", "D"。 "E"),
Var1 = c(3. 7, 7.8, 8. 9, 7.0, 3. 4),3.
Var2 = rep(""。 5),
Var3 = rep(""。 5)) %> %
安排(-Var1),
資料。 frame( obs= c("A"/span>。 "B"。 "C", "D"。 "E"),
Var1 = rep(""。 5),
Var2 = c(2. 7, 8.0, 1. 0, 1.0, 2。 0),2.
Var3 = rep("。 5)) %> %
安排(-Var2),
資料。 frame( obs = c("A", "B"。 "C", "D"。 "E"),
Var1 = rep(""。 5),
Var2 = rep("。 5),
Var3 = c(9. 1, 1.5, 2. 7, 9.0, 5. 0)) %>%
arrange(-Var3)
)
輸出:
如何使這個程序對于多個觀察和列來說更加有效和通用?
uj5u.com熱心網友回復:
以長格式獲取資料,以降序排列資料,創建一個行號列,以寬格式獲取資料。
使用dplyr和tidyr庫,你可以這樣做 -
library(dplyr)
library(tidyr)
df%>%
pivot_longer(cols = -obs) %> %
arrange(name, desc(value) %> %
mutate(row = row_number()) %> %
pivot_wider(names_from =name, values_from = value) %> %
select(-row)
# obs Var1 Var2 Var3
# <chr> <dbl> <dbl> <dbl>/span>
# 1 C 8.9 NA NA
# 2 B 7.8 NA NA
# 3 D 7 NA NA
# 4 A 3.7 NA NA
# 5 E 3.4 NA NA
# 6 B NA 8 NA
# 7 A NA 2.7 NA
# 8 E NA 2 NA
# 9 C NA 1 NA
#10 D NA 1 NA
#11 A NA NA 9.1
#12 D NA NA 9
#13 E NA NA 5
#14 C NA NA 2.7
#15 B NA NA 1.5
uj5u.com熱心網友回復:
一個使用Map和只使用基礎包的快速解決方案。
r <- do.call(/span>rbind,>
Map(/span>(x, y, z) {x < -x[y, ]。x[-c(1。 z)] < - NA; x},
list(d)。 lapply(d[-1]/span>。 順序。 遞減=T)。 seq(ncol(d))) 標點符號">[-1]))
r
# obs Var1 Var2 Var3
# 3 C 8.9 NA NA
# 2 B 7.8 NA NA
# 4 D 7.0 NA NA
# 1 A 3.7 NA NA
# 5 E 3.4 NA NA
# 21 B NA 8.0 NA
# 11 A NA 2.7 NA
# 51 E NA 2.0 NA
# 31 C NA 1.0 NA
# 41 D NA 1.0 NA
# 12 A NA NA 9.1
# 42 D NA 9.0
# 52 E NA 5.0
# 32 C NA 2.7
# 22 B NA NA 1.5
Benchmark
這應該是稍微有效的。
這應該是稍微有效的。
# Unit: microseconds
# expr min lq mean median uq max neval cld
# Map 876.396 900.545 970.8851 981.9155 1014.284 1145.8 100 a
# dplyr 14744.610 14963.718 17997.4444 15439.0440 15752.575 241073.9 100 b
資料:
d < -結構(list(obs = c("A"/span>。 "B"/span>。 "C", "D"。 "E")。 Var1 = c(/span>3. 7,.
7.8, 8。 9, 7, 3。 4), Var2 = c(2. 7, 8。 1, 1。 2)。 Var3 = c(9. 1, 1.5,
2. 7, 9。 5))。 class = "data. frame",行。 names = c(NA。 -5L))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/310837.html
標籤:

