我有一個看起來像這個例子的資料框(只是大得多):
var <- c('Peter','Ben','Mary','Peter.1','Ben.1','Mary.1','Peter.2','Ben.2','Mary.2')
v1 <- c(0.4, 0.6, 0.7, 0.3, 0.9, 0.2, 0.4, 0.6, 0.7)
v2 <- c(0.5, 0.4, 0.2, 0.5, 0.4, 0.2, 0.1, 0.4, 0.2)
df <- data.frame(var, v1, v2)
var v1 v2
1 Peter 0.4 0.5
2 Ben 0.6 0.4
3 Mary 0.7 0.2
4 Peter.1 0.3 0.5
5 Ben.1 0.9 0.4
6 Mary.1 0.2 0.2
7 Peter.2 0.4 0.1
8 Ben.2 0.6 0.4
9 Mary.2 0.7 0.2
我想根據不帶后綴的名稱對'var'中的字串進行分組,并保持最初出現的原始順序。期望的輸出:
var v1 v2
1 Peter 0.4 0.5 # Peter appears first in the original data
2 Peter.1 0.3 0.5
3 Peter.2 0.4 0.1
4 Ben 0.6 0.4 # Ben appears second in the original data
5 Ben.1 0.9 0.4
6 Ben.2 0.6 0.4
7 Mary 0.7 0.2 # Mary appears third in the original data
8 Mary.1 0.2 0.2
9 Mary.2 0.7 0.2
我怎樣才能做到這一點?
謝謝!
uj5u.com熱心網友回復:
一個選項是創建一個臨時列,不帶和末尾.
的數字 ( ) with ,然后使用with指定為值或用于資料\\d
str_remove
factor
levels
unique
match
arrange
library(dplyr)
library(stringr)
df <- df %>%
mutate(var1 = str_remove(var, "\\.\\d $")) %>%
arrange(factor(var1, levels = unique(var1))) %>%
select(-var1)
或使用fct_inorder
from which 將按首次出現的順序forcats
轉換為factor
withlevels
library(forcats)
df %>%
arrange(fct_inorder(str_remove(var, "\\.\\d $")))
-輸出
var v1 v2
1 Peter 0.4 0.5
2 Peter.1 0.3 0.5
3 Peter.2 0.4 0.1
4 Ben 0.6 0.4
5 Ben.1 0.9 0.4
6 Ben.2 0.6 0.4
7 Mary 0.7 0.2
8 Mary.1 0.2 0.2
9 Mary.2 0.7 0.2
uj5u.com熱心網友回復:
如果您不介意其中的值var
按字母順序排列,那么最簡單的解決方案是:
df %>%
arrange(var)
var v1 v2
1 Ben 0.6 0.4
2 Ben.1 0.9 0.4
3 Ben.2 0.6 0.4
4 Mary 0.7 0.2
5 Mary.1 0.2 0.2
6 Mary.2 0.7 0.2
7 Peter 0.4 0.5
8 Peter.1 0.3 0.5
9 Peter.2 0.4 0.1
uj5u.com熱心網友回復:
sub
帶有和的緊湊選項data.table::chgroup
df[chgroup(sub("\\..", "", df$var)),]
var v1 v2
1 Peter 0.4 0.5
4 Peter.1 0.3 0.5
7 Peter.2 0.4 0.1
2 Ben 0.6 0.4
5 Ben.1 0.9 0.4
8 Ben.2 0.6 0.4
3 Mary 0.7 0.2
6 Mary.1 0.2 0.2
9 Mary.2 0.7 0.2
chgroup
將重復的值組合在一起,但保留組順序(根據每個組的第一次出現順序),有效
uj5u.com熱心網友回復:
separate
將var
列分成兩列,將生成的 NA 替換為 0,排序并洗掉額外的列。
這適用于數字的數值而不是字符表示,因此例如,10 不會出現在 2 之前。此外,match
inarrange
確保順序基于第一次出現的順序。
df %>%
separate(var, c("alpha", "no"), convert=TRUE, remove=FALSE, fill="right") %>%
mutate(no = replace_na(no, 0)) %>%
arrange(match(alpha, alpha), no) %>%
select(-alpha, -no)
給予
var v1 v2
1 Peter 0.4 0.5
2 Peter.1 0.3 0.5
3 Peter.2 0.4 0.1
4 Ben 0.6 0.4
5 Ben.1 0.9 0.4
6 Ben.2 0.6 0.4
7 Mary 0.7 0.2
8 Mary.1 0.2 0.2
9 Mary.2 0.7 0.2
更新
在閱讀問題的更新后洗掉了以前的第一個解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/504831.html
上一篇:按多個欄位對物件陣列進行排序
下一篇:獲取2個字串之間的字串