2017-05-22 54 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