根据列名的第一个字符修剪数据

时间:2017-09-13 20:33:35

标签: r packages

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

有任何建议如何实现这一目标?感谢。

3 个答案:

答案 0 :(得分:2)

在使用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”后跟一个或多个数字,则可以将模式细化为^T\\d+

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

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

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

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

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

注意:在评论中我错误地使用了括号,如:[T,M]。使用括号告诉RegEx匹配括号中的一个字符,因此在这种情况下它将匹配“T”,“M”或“,”。显然我们不想在这里匹配逗号,并且在括号中用逗号分隔每个字符在语法上是不正确的。要匹配“T”或“M”,括号中的正确语法为[TM],但是,要匹配单词或上述短字符串,我们必须使用 | 作为“或“操作员。

答案 1 :(得分:1)

> 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。

答案 2 :(得分:0)

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

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