R通过选择部分字符串创建一列

R create a column by selecting partial strings

我有一个数据框,我想通过分隔符提取其中一列上的特定字符串,但有几个条件。我想改变一个仅包含 COSVxxxx 字符串的新列。

df:

ID
.
COSV50419740
.
.
.
rs375210814
.
rs114284775;COSV60321424
.
.
.
rs67376798;88974
rs1169783812
rs56386506;51676;COSV66451617
rs80358907;52202
.
.
.
482972
629301
COSV66463357
rs80358408;51066
rs80358420;51100;COSV66464432

所需的 df:

ID  COSV.ID
.   .
COSV50419740    COSV50419740
.   .
.   .
.   .
rs375210814 rs375210814
.   .
rs114284775;COSV60321424    COSV60321424
.   
.   
.   
rs67376798;88974    rs67376798;88974
rs1169783812    rs1169783812
rs56386506;51676;COSV66451617   COSV66451617
rs80358907;52202    rs80358907;52202
.   .
.   .
.   .
482972  482972
629301  629301
COSV66463357    COSV66463357
rs80358408;51066    rs80358408;51066
rs80358420;51100;COSV66464432   COSV66464432

如果没有 COSV 注释,我想保留字符串。但是,我的问题是有些行包含一到四个冒号分隔符的注释。我尝试使用 cSplit 函数将它们分开,但不知道如何将 COSV 字符串转换为一列。

你可以在这里使用sub,例如

df$ID_new <- ifelse(grepl("\bCOSV\d+\b", df$ID),
                    sub("^.*\b(COSV\d+)\b.*$", "\1", df$ID),
                    NA)

此选项将分配(最后的)COSV 值,如果它存在于 ID 列中,否则将分配 NA.