我有一些變數/值格式的蛋白質資料。“價值”是不言自明的。“變數”是“PRTN_ASSAYCODE”形式的字串,其中“PRTN”是特定蛋白質,“ASSAYCODE”是用于檢測蛋白質的序列的單獨字串。對于給定的蛋白質,有一個、兩個或三個不同的序列。
我想要做的是將字串拆分為兩個單獨的變數,并將它們用于 ggplot 中的 facet_grid(垂直顯示蛋白質,水平顯示每個蛋白質的不同方法)。為此,我需要創建一個新變數(1,2 或 3,或其他一些因素)。
例如:
input output
ALBU_AAFZXAA --> ALBU, 1
ALBU_AAFZXAA --> ALBU, 1
ALBU_ABGHHSA --> ALBU, 2
FIBR_HFGIAAO --> FIBR, 1
FIBR_YOUSAAA --> FIBR, 2
FIBR_ERAATTA --> FIBR, 3
我可以使用 strsplit 來拆分字串,即我有蛋白質代碼,但沒有可用形式的檢測代碼。
到目前為止,我最好的猜測是使用 for 回圈運行資料幀,查找字串第一部分的更改,然后注釋字串第二部分的任何更改。但這真的很麻煩而且容易出錯。
任何有用的想法?我的資料框有 ~3000 行,所以手動注釋不是一個選項。
uj5u.com熱心網友回復:
使用 data.table 函式tstrplit()和rleid()- 前者正在拆分字串,后者正在創建順序。每種蛋白質的by制造rleid()重置。
library(data.table)
data <- data.table(
protein = c("ABC_DFG", "ABC_DFG", "ABC_HIJ", "XYZ_TUV")
)
# Solution:
data[, `:=`("ID1" = tstrsplit(protein, "_")[[1]],
"ID2" = rleid(tstrsplit(protein, "_")[[2]])),
by=tstrsplit(protein, "_")[[1]]]
結果是
> data
protein ID1 ID2
1: ABC_DFG ABC 1
2: ABC_DFG ABC 1
3: ABC_HIJ ABC 2
4: XYZ_TUV XYZ 1
更整潔的代碼,使用 data.table 鏈接 ( DT[][])
data[, ID1 := tstrsplit(protein, "_")[[1]]][,
ID2 := rleid(tstrsplit(protein, "_")[[2]]), by=ID1]
uj5u.com熱心網友回復:
使用tidyr::separate. 然后v1,您可以使用和v2作為您的facet_grid.
data %>% separate(protein, c("v1","v2"))
v1 v2
1 ALBU AAFZXAA
2 ALBU AAFZXAA
3 ALBU ABGHHSA
4 FIBR HFGIAAO
5 FIBR YOUSAAA
6 FIBR ERAATTA
要獲得數字id,請添加data.table::rleid.
data %>% separate(protein, c("v1","v2")) %>%
group_by(v1) %>%
mutate(group = data.table::rleid(v2))
資料
data <- data.frame(protein = c("ALBU_AAFZXAA", "ALBU_AAFZXAA", "ALBU_ABGHHSA",
"FIBR_HFGIAAO","FIBR_YOUSAAA","FIBR_ERAATTA"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377735.html
