如何删除R中数据框列中的部分字符串?

时间:2017-06-30 16:31:35

标签: r sapply strsplit

我有一个如下数据框:

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

2 个答案:

答案 0 :(得分:2)

您可以使用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用第二个参数替换第一个参数的匹配。在这种情况下,我们想要|以及它之后的一切。你不能只写|因为它在正则表达式中具有特殊含义,因此您可以通过编写\\ |来“逃避”它。接下来是。*。的。表示“任何字符”,*表示任意次数,因此\\ |。*表示|后跟任意数量的字符。我们用空字符串“”替换它。我们将此操作应用于as.character(df$S),因为您的错误消息使您的变量df$S看起来像是一个因素,而不是字符串。

答案 1 :(得分:1)

SD <- sapply(strsplit(as.character(df[["S"]]), split='|', fixed=TRUE), "[[", 1)

您可能有因素而非字符列?