【问题标题】:How to extract columns with same name but different identifiers in R如何在R中提取具有相同名称但不同标识符的列
【发布时间】:2017-05-22 20:44:07
【问题描述】:

对不起,如果它太基础了,但我对 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")]

但是我有很多这种类型的列,所以我不想单独输入。我确信有一些聪明的方法可以做到这一点。

谢谢!

【问题讨论】:

    标签: r extract


    【解决方案1】:

    试试这个以获取名称以“A”开头的所有列

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

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

    【讨论】:

    • 确定 A 之后 之后的内容可能会很好。 df[,grep("^A(\\.\\d+)?$", names(df))]
    • @42- 效果很好!只是好奇:如果一个人也想要“A”和“B”呢?假设“B”也具有与“A”相同的模式。
    • @kin182 请看我对这个问题的附加答案。
    • @kin182 :如果您想允许多个起始值匹配,则将选项括在方括号中,将它们放入正则表达式“捕获类”:grepl("^[AB]", names( df))。正如我上面所建议的,这也记录在?regex
    【解决方案2】:

    如果我们使用tidyversestarts_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
    

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

      • 这种方法非常适合提取 A 和 B。谢谢!
      • 你把事情复杂化了——df[,str_detect(names(df),'A')]——因为str_detect返回一个逻辑向量,它也可以用于选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      相关资源
      最近更新 更多