2017-09-13 28 views
0

我有一個包含多個列的數據集。使用R我只想保留第一個字符爲T的列,以創建一個子集,如下面的輸出數據所示。基於列名第一個字符的修整數據

輸入數據

T1234 T5678 T9101112 A B D E 
    1  2  3 4 5 6 7 
    1  2  3 4 5 6 7 
    1  2  3 4 5 6 7 
    1  2  3 4 5 6 7 
    1  2  3 4 5 6 7 
    1  2  3 4 5 6 7 
    1  2  3 4 5 6 7 

輸出數據

T1234 T5678 T9101112 
    1  2  3 
    1  2  3 
    1  2  3 
    1  2  3 
    1  2  3 
    1  2  3 
    1  2  3 

任何建議如何可以做到這一點?謝謝。

回答

2

在基礎R使用RegEx

df <- data.frame(T1234=rep(1,7),T5678=2,T9101112=3,A=4,B=5,D=6,E=7) 

df[,grepl("^T",names(df))] 

在每行名的開頭的正則表達式模式匹配^T噸。作爲另一個例子,如果您想匹配「T」後跟一個或多個數字,則可以將模式細化到^T\\d+

另請注意,^斷言您處於字符串的開頭。沒有它,你會匹配「AT912340」,因爲它包含了一個T.

對於多個字符,我們會使用「或」運算符|

df[,grepl("^T|M",names(df))] 

和(由T或M開始即列)匹配像RDY或MTP字符組,我們會做這樣的:

df[,grepl("^T|MTP|Check|RDY",names(df))] 

注:在評論我錯誤地使用括號像這樣:[T,M]。使用括號告訴RegEx匹配括號中的一個字符,因此在這種情況下它會匹配「T」,「M」或「,」。顯然,我們不希望在這裏匹配逗號,並且在括號內用逗號分隔每個字符在語法上是不正確的。爲了匹配「T」或「M」,括號中的正確語法將是[TM],但是,要匹配單詞或像上面那樣的短字符串,我們必須使用|作爲「或」運算符。

+0

。@ Mako212 - 謝謝,它有效。我可以擴展它以添加多個模式。例如:我想用'T *'和'M *'保留列。我可以寫多個'df [,grepl(「^ T。*」,names(df))]''''和'df [,grepl(「^ M。*」,names(df))]''然後'cbind )'他們得到一個'data' –

+0

@ChetanArvindPatil無需編寫多個語句,除非RegEx開始太亂以至於無法跟蹤。 – Mako212

+0

。@ Mako212 - 我需要根據這些'「^ [T,MTP,Check,RDY]」修剪數據集,但是我看到的是第一個字符爲「P」和「M」的列也正在與它一起修剪。'grepl'應該匹配'MTP'和列名的前三個字符,然後決定是否修剪?類似的檢查和RDY? –

1
> require(dplyr) 
> df <- data.frame(T1234=rep(1,7),T5678=2,T9101112=3,A=4,B=5,D=6,E=7) 
> df 
    T1234 T5678 T9101112 A B D E 
1  1  2  3 4 5 6 7 
2  1  2  3 4 5 6 7 
3  1  2  3 4 5 6 7 
4  1  2  3 4 5 6 7 
5  1  2  3 4 5 6 7 
6  1  2  3 4 5 6 7 
7  1  2  3 4 5 6 7 
> select(df,starts_with('T')) 
    T1234 T5678 T9101112 
1  1  2  3 
2  1  2  3 
3  1  2  3 
4  1  2  3 
5  1  2  3 
6  1  2  3 
7  1  2  3 
> 

,或在不dplyr

> df[,grepl('T',colnames(df))] 
    T1234 T5678 T9101112 
1  1  2  3 
2  1  2  3 
3  1  2  3 
4  1  2  3 
5  1  2  3 
6  1  2  3 
7  1  2  3 
> 

而後者將達到T IN的任何位置。

+0

@ mrbcuda - 謝謝。可以這樣做_without_'dplyr()'? –

0

另一種解決方案,而無需使用regex

df[,substr(names(df),1,1) %in% c("T","M")] 
相關問題