2017-05-22 67 views
0

對不起列,但不同的標識符,如果實在是太基本的,但我不熟悉R.如何提取具有相同名稱中的R

我有具有相同的列名多列數據幀,所以後被導入到R,標識符已被添加。事情是這樣的:

A = c(2, 3, 5) 
A.1 = c('aa', 'bb', 'cc') 
A.2 = c(TRUE, FALSE, TRUE) 
B = c(1, 2, 5) 
B.1 = c('bb', 'cc', 'dd') 
B.2 = c(TRUE, TRUE, TRUE) 

df = data.frame(A, A.1, A.2, B, B.1, B.2) 

df 
    A A.1 A.2 B B.1 B.2 
1 2 aa TRUE 1 bb TRUE 
2 3 bb FALSE 2 cc TRUE 
3 5 cc TRUE 5 dd TRUE 

我想提取具有A所有列,而不管標識符擴展,因此它變得像:

A A.1 A.2 
1 2 aa TRUE 
2 3 bb FALSE 
3 5 cc TRUE 

我知道我們能

df2 = df[, c("A", "A.1", "A.2")] 

但是我有很多這種類型的列,所以我不想單獨輸入。我相信有這樣的巧妙方法。

謝謝!

回答

3

試試這個讓所有的列有從「a」

df2 = df[, grepl("^A", names(df))] 

的r提取'[' - 功能允許在它的兩個參數模式使用邏輯索引的名字。你會發現在R中的正則表達式功能非常有用,我可以推薦閱讀?regex以及在@G上尋找SO和Rhelp Archives的例子。如果我們使用tidyverse的grothendieck

+1

這可能是好是肯定會發生什麼_after_在A了。 'df [,grep(「^ A(\\。\\ d +)?$」,names(df))]' – G5W

+0

@ 42-它很棒!只是好奇:如果想要「A」和「B」,那麼該怎麼辦?假設「B」也具有與「A」相同的模式。 – kin182

+0

@ kin182請看這個問題的附加答案。 – Wen

1
library(stringr) 
A = c(2, 3, 5) 
A.1 = c('aa', 'bb', 'cc') 
A.2 = c(TRUE, FALSE, TRUE) 
B = c(1, 2, 5) 
B.1 = c('bb', 'cc', 'dd') 
B.2 = c(TRUE, TRUE, TRUE) 
df = data.frame(A, A.1, A.2, B) 
df[,str_detect(names(df),'A')] 
    A A.1 A.2 
1 2 aa TRUE 
2 3 bb FALSE 
3 5 cc TRUE 



#If you want to find out A or B. 
A = c(2, 3, 5) 
A.1 = c('aa', 'bb', 'cc') 
A.2 = c(TRUE, FALSE, TRUE) 
B = c(1, 2, 5) 
B.1 = c('bb', 'cc', 'dd') 
F.2 = c(TRUE, TRUE, TRUE) 
df = data.frame(A, A.1, A.2, B,F.2) 
df[,str_detect(names(df),'A|B')] 
    A A.1 A.2 B 
1 2 aa TRUE 1 
2 3 bb FALSE 2 
3 5 cc TRUE 5 
+0

這種方法非常適合解開A和B.謝謝! – kin182

+0

你過於複雜的東西 - ''df [,str_detect(names(df),'A')]' - 因爲'str_detect'返回一個邏輯向量,也可以用於選擇。 – thelatemail

+0

@thelatemail,謝謝,已經修改過。 – Wen

0

starts_with是單向的

library(tidyverse) 
df %>% 
    select(starts_with("A")) 
# A A.1 A.2 
#1 2 aa TRUE 
#2 3 bb FALSE 
#3 5 cc TRUE