如何删除 R 中数据框列中的部分字符串?
How to remove part of a string in a column of dataframe in R?
我有如下数据框:
df:
S S1 S2 S3 S4
100130426 0 0 0.9066 0
100133144 16.3644 9.2659 11.6228 12.0894
100134869 12.9316 17.379 9.2294 11.0799
3457 1910.3 2453.50 2695.37 1372.3624
9834 1660.13 857.30 1240.53 1434.6463
ATP5L2|267 0 0 0.9066 0
ATP5L|1063 1510.29 1270.79 2965.54 2397.1866
ATP5O|539 2176.17 1868.95 2004.53 2360.3641
我真的想删除“|”以及“|”之后的数字在第一列。例如:ATP5L2|267 应该类似于 ATP5L2。
所以我尝试了以下方法:
SD <- sapply(strsplit(df$s, split='|', fixed=TRUE), function(x) (x[1]))
但这给了我一个错误:
Error in strsplit(s, split = "|", fixed = TRUE) : non-character argument.
输出应如下所示:
df:
S S1 S2 S3 S4
100130426 0 0 0.9066 0
100133144 16.3644 9.2659 11.6228 12.0894
100134869 12.9316 17.379 9.2294 11.0799
3457 1910.3 2453.50 2695.37 1372.3624
9834 1660.13 857.30 1240.53 1434.6463
ATP5L2 0 0 0.9066 0
ATP5L 1510.29 1270.79 2965.54 2397.1866
ATP5O 2176.17 1868.95 2004.53 2360.3641
SD <- sapply(strsplit(as.character(df[["S"]]), split='|', fixed=TRUE), "[[", 1)
你可能有因子而不是字符列?
您可以使用 sub
和正则表达式来完成此操作。
df$S = sub("\|.*", "", as.character(df$S))
df
S S1 S2 S3 S4
1 100130426 0.0000 0.0000 0.9066 0.0000
2 100133144 16.3644 9.2659 11.6228 12.0894
3 100134869 12.9316 17.3790 9.2294 11.0799
4 3457 1910.3000 2453.5000 2695.3700 1372.3624
5 9834 1660.1300 857.3000 1240.5300 1434.6463
6 ATP5L2 0.0000 0.0000 0.9066 0.0000
7 ATP5L 1510.2900 1270.7900 2965.5400 2397.1866
8 ATP5O 2176.1700 1868.9500 2004.5300 2360.3641
详情:
sub
将第二个参数替换为与第一个参数匹配的任何内容。在这种情况下,我们想要 |以及之后的一切。你不能只写 |因为它在正则表达式中有特殊含义,所以你 "escape" 通过写 \\| 来表示它。后跟.*。这 。表示 "any character" 和 * 表示任意次数,所以一起 \\|.* 表示 |后跟任意数量的字符。我们用空字符串“”替换它。我们将此操作应用于 as.character(df$S)
因为您的错误消息使它看起来像您的变量 df$S
可能是一个因素,而不是一个字符串。
我有如下数据框:
df:
S S1 S2 S3 S4
100130426 0 0 0.9066 0
100133144 16.3644 9.2659 11.6228 12.0894
100134869 12.9316 17.379 9.2294 11.0799
3457 1910.3 2453.50 2695.37 1372.3624
9834 1660.13 857.30 1240.53 1434.6463
ATP5L2|267 0 0 0.9066 0
ATP5L|1063 1510.29 1270.79 2965.54 2397.1866
ATP5O|539 2176.17 1868.95 2004.53 2360.3641
我真的想删除“|”以及“|”之后的数字在第一列。例如:ATP5L2|267 应该类似于 ATP5L2。
所以我尝试了以下方法:
SD <- sapply(strsplit(df$s, split='|', fixed=TRUE), function(x) (x[1]))
但这给了我一个错误:
Error in strsplit(s, split = "|", fixed = TRUE) : non-character argument.
输出应如下所示:
df:
S S1 S2 S3 S4
100130426 0 0 0.9066 0
100133144 16.3644 9.2659 11.6228 12.0894
100134869 12.9316 17.379 9.2294 11.0799
3457 1910.3 2453.50 2695.37 1372.3624
9834 1660.13 857.30 1240.53 1434.6463
ATP5L2 0 0 0.9066 0
ATP5L 1510.29 1270.79 2965.54 2397.1866
ATP5O 2176.17 1868.95 2004.53 2360.3641
SD <- sapply(strsplit(as.character(df[["S"]]), split='|', fixed=TRUE), "[[", 1)
你可能有因子而不是字符列?
您可以使用 sub
和正则表达式来完成此操作。
df$S = sub("\|.*", "", as.character(df$S))
df
S S1 S2 S3 S4
1 100130426 0.0000 0.0000 0.9066 0.0000
2 100133144 16.3644 9.2659 11.6228 12.0894
3 100134869 12.9316 17.3790 9.2294 11.0799
4 3457 1910.3000 2453.5000 2695.3700 1372.3624
5 9834 1660.1300 857.3000 1240.5300 1434.6463
6 ATP5L2 0.0000 0.0000 0.9066 0.0000
7 ATP5L 1510.2900 1270.7900 2965.5400 2397.1866
8 ATP5O 2176.1700 1868.9500 2004.5300 2360.3641
详情:
sub
将第二个参数替换为与第一个参数匹配的任何内容。在这种情况下,我们想要 |以及之后的一切。你不能只写 |因为它在正则表达式中有特殊含义,所以你 "escape" 通过写 \\| 来表示它。后跟.*。这 。表示 "any character" 和 * 表示任意次数,所以一起 \\|.* 表示 |后跟任意数量的字符。我们用空字符串“”替换它。我们将此操作应用于 as.character(df$S)
因为您的错误消息使它看起来像您的变量 df$S
可能是一个因素,而不是一个字符串。