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