2011-07-05 65 views
2

正如標題所述,我試圖將數據框中的元素從一個字符更改爲另一個字符。數據幀如下:R更改數據框中的元素

g1=c("CC","DD","GG") 
g2=c("AA","BB","EE") 
g3=c("HH","II","JJ") 

df=data.frame(g1,g2,g3) 

我希望將元件從letterletter格式轉換爲信/信格式(例如CC到C/C或AA到A/A)

我知道使用「strsplit 「會在名單上工作。 我也知道,我需要以某種方式合併:崩潰=「/」

我將如何能夠將strsplit函數應用於整個數據框?

我想沿着線的東西:

split=function(x) 
{ 
    unlist(paste(strsplit(x,""),collapse="/")) 
} 

j=as.data.frame(apply(df,1,split)) 

,但它並沒有取得理想的結果。

更新---------------- 顯然,下面的腳本作品:

split=function(x) 
{ 
    paste(unlist(strsplit(x,"")),collapse="/") 
} 

p=apply(df,c(1,2),split) 

如果有一個更有效的或方便的方式,請隨時分享。

+0

是否可以安全使用'分裂'功能名稱?已經有一個名爲的基礎包函數。 –

回答

6

我能想到的兩種方式來處理這個。一個像你一樣使用strsplit。你只失蹤,其中來自strsplit返回你遍歷列表中的每個元素的部分:其中空字符串不是在開始處匹配

Split <- function(x) { 
    #unlist(lapply(strsplit(x, ""), paste, collapse="/")) 
    sapply(strsplit(x, ""), paste, collapse="/") 
} 
as.data.frame(lapply(df, Split)) 

另一種方法是使用gsub\\B符號,或「單詞」的結尾。

as.data.frame(lapply(df, gsub, pattern="\\B", replacement="/")) 

什麼構成一個「字」取決於語言環境和實現,所以這裏的使用gsub和反向引用另一種解決方案。

as.data.frame(lapply(df, gsub, pattern="(.)(.)", replacement="\\1/\\2")) 
1

這裏有一點使用gsub破解。誰知道有人更多的正則表達式應該是能夠改善這一點:

mySplit <- function(x) 
{ 
    substr(gsub("","/",x),2,4) 
} 

as.data.frame(apply(df,2,mySplit)) 

你原來的解決方案是不工作的原因是因爲你unlist荷蘭國際集團在錯誤的地點。所以,如果你unlist後,用lapply工作的事情,你可能會想到:

mySplit1 <- function(x) 
{ 
    unlist(lapply(strsplit(x,""),paste,collapse="/")) 
} 

as.data.frame(apply(df,2,mySplit1)) 
+0

我剛剛測試過,出來的是: 'g1 = c(「C/C」,「D/D」,「G/G」) g2 = g1 g3 = g1 data.frame(g1 ,g2,g3)' – Anon

+0

對不起,錯字!很快修復... – joran

0

另一個黑客使用粘貼(),絕對不是優雅,但它完成工作。

for (col in 1:ncol(df)){ 
    df[,col] = paste(substr(df[,col],1,1),"/",substr(df[,col],1,1), sep="") 
} 
2

開始像這樣

insertslash <- function(x) sapply(strsplit(x, ""), function(x) paste(x, collapse="/")) 

函數定義說服自己,它做什麼,它應該由insertslash(g1)

將它應用到數據幀的所有列,這樣做:

as.data.frame(apply(df, 2, insertslash)) 

很明顯,你可以滾成一個討厭的一行這樣的:

as.data.frame(apply(df, 2, function(x) sapply(strsplit(x, ""), function(x) paste(x, collapse="/"))))