2011-11-10 62 views
0

我有一個數據幀,其中一列包含一組名稱。我想stringsplit列名的一部分,並已經這樣做了如下:有條件strsplit

DF$newname <- sapply(strsplit(as.character(DF$oldname), "_"), '[', 5) 

在這個例子中分裂的第五部分包含字符串的名稱部分。問題是這個數據集包含$oldname不同格式的名稱。在第一種格式的名稱如下:其中XXX爲數字:

xxx_xxx_xxx_xxx_name_xx (name is in fifth position) 

和第二格式的$oldname看起來像這樣

xxx_xxx_xxx_xxx_xxx_name_xx (name is in sixth position) 

我在想,我可以從內使用ifelse命令函數,但我遇到了麻煩與下面的代碼一點點:

namesplit = function(df){ 
    x <- strsplit(as.character(df$oldname), "_"), '[', 5) 
    y <- strsplit(as.character(df$oldname), "_"), '[', 6) 
    ifelse(is.character(x),x,y) } 
DF$newname <- sapply(DF,namesplit) 

這個代碼不工作,我知道我可以的使用[這種方式,但我不知道最好的方法。雖然我認爲我可以在for循環內工作,但我更願意找到一種方法來提取名稱,以便我可以使用apply

謝謝。

回答

2

您可以輕鬆地做到這一點使用gsub

names <- c('xxx_xxx_xxx_xxx_xxx_name1_xx', 'xxx_xxx_xxx_xxx_name2_xx') 
gsub("^.*_([[:alnum:]]+)_.*$", "\\1", names) 


[1] "name1" "name2" 
+0

謝謝Ramnath。在他的例子中,我簡化了一些名字(他們是從FASTA頭文件中得到的,它們混合了字符和數字數據,當我將這種方法應用到真實數據集時,它並不總是應用真實值。包括一個'ifelse',這樣我就可以擴展這個數據集,可以有另一種格式 – zach

+0

但是....我認爲你是對的,我應該能夠稍微調整一下你的解決方案來得到我需要的 – zach

+0

如果你正在解析FASTA頭文件,請查看這個博客上使用'C'和'R'完成這個工作的代碼 – Ramnath

1

如果名字是倒數第二個片段這個怎麼樣:

x <- c("xxx_xxx_xxx_xxx_name_xx", "xxx_xxx_xxx_xxx_xxx_name_xx") 


namesplit = function(x){ 
x <- strsplit(as.character(x), "_") 
sapply(x, function(x) x[length(x)-1]) 
} 

HTH

+0

我喜歡這種方法,只是名稱的一個子集中有多個由''_''字符分隔的單詞,從末尾開始計數將會不一致,謝謝,不過! – zach

+0

@zach那麼,y怎麼樣當你用「_」分割時,你希望分割它,也會分裂你的名字嗎? –

+0

這些名稱是化學名稱。名字的第一部分是最重要的。其他部分並不重要,但會干擾向後倒數。這個數據集是給我的,所以將來我會用不同的字符分隔化學名稱。一個名字可能是「酪氨酸」,另一個名字可能是「Proline_Alpha」。我只會關心主要的名字。如果問題有誤導性,我很抱歉。 – zach