Trim 基于列名第一个字符的数据

Trim Data Based on First Character of Column Name

我有一个包含多列的数据集。使用 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   

有什么建议可以实现吗?谢谢。

> 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

在使用 RegEx 的基础 R 中

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" 后跟 1 个或多个数字,则可以将模式优化为 ^T\d+,作为另一个示例。

另请注意,^ 断言您位于字符串的开头。没有它你会匹配 "AT912340" 因为它包含一个 T.

对于多个字符(即以 T 或 M 开头的列),我们将使用 "or" 运算符 |

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

为了匹配像 RDY 或 MTP 这样的字符组,我们会这样做:

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

注意:在评论中我错误地使用了括号,例如:[T,M]。使用方括号告诉 RegEx 匹配方括号中的字符之一,因此在本例中它将匹配 "T"、"M" 或“,”。显然我们不想在这里匹配逗号,并且在括号中分隔每个字符在语法上是不正确的。要匹配 "T" 或 "M",带括号的正确语法是 [TM],但是,要匹配上面的单词或短字符串,我们必须使用 | 作为 "or" 运算符。

不使用regex的另一种解决方案:

df[,substr(names(df),1,1) %in% c("T","M")]