如何在R中提取具有相同名称但标识符不同的列

时间:2017-05-22 20:44:07

标签: r extract

很抱歉,如果它太基础了,但我不熟悉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 个答案:

答案 0 :(得分:3)

尝试此操作以获取名称以“A”

开头的所有列
df2 = df[, grepl("^A", names( df))]

R的提取'[' - 函数允许在其双参数模式中使用逻辑索引。您会发现R中的正则表达式函数非常有用,我建议您阅读?regex以及查找@G的SO和Rhelp Archives上的示例。格罗滕迪克

答案 1 :(得分: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

答案 2 :(得分:0)

如果我们使用tidyverse,则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