我有一个包含多列的数据集。使用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
有任何建议如何实现这一目标?感谢。
答案 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")]