2011-09-11 61 views
1

我有一個包含數字和字母組合的大型數據集。只是一個小例子:使用模式重新格式化數據

sex <- c("M", "F", "F", "M", "M") 
ind <- c("I1", "I2", "I3", "I4", "C") 
M1 <- c("ab", "bb", "ac", "ad", "dd") 
M2 <- c(12, 22, 23, 24, 25) 
M3 <- c("AT", "AG", "AC", "GG", "TC") 
M4 <- c(22, 23, 24, 14, 24) 
mydf <- data.frame(sex, ind, M1, M2, M3, M4) 
mydf 
    sex ind M1 M2 M3 M4 
1 M I1 ab 12 AT 22 
2 F I2 bb 22 AG 23 
3 F I3 ac 23 AC 24 
4 M I4 ad 24 GG 14 
5 M C dd 25 TC 24 

我想在列中的兩個字符之間引入一個「/」標記M1 ......的Mn(文件的結束),使得所得到的數據幀的樣子:

 sex ind M1 M2 M3 M4 
    1 M I1 a/b 1/2 A/T 2/2 
    2 F I2 b/b 2/2 A/G 2/3 
    3 F I3 a/c 2/3 A/C 2/4 
    4 M I4 a/d 2/4 G/G 1/4 
    5 M C d/d 2/5 T/C 2/4 

對不起,我是一無所知,如何進行......您的幫助表示讚賞...

回答

2

一個內膽:

> data.frame(lapply(mydf, function(x) sub("(.)(.)", "\\1/\\2", x))) 
    sex ind M1 M2 M3 M4 
1 M I/1 a/b 1/2 A/T 2/2 
2 F I/2 b/b 2/2 A/G 2/3 
3 F I/3 a/c 2/3 A/C 2/4 
4 M I/4 a/d 2/4 G/G 1/4 
5 M C d/d 2/5 T/C 2/4 
+0

謝謝你的苗條解決方案,但我並不打算以適用於ind變量,所以我可以很容易地通過刪除:data.frame(lapply(mydf [,3:length(mydf)],function(x)sub(「(。)(。)」,「\\ 1/\\ 2「,x))) – jon

0

這似乎是工作。

m1 <- substr(mydf$M1, start=1, stop=1) 
m2 <- substr(mydf$M1, start=2, stop=2) 
paste(m1, m2, sep="/") 

輸出

[1] "a/b" "b/b" "a/c" "a/d" "d/d" 
+0

感謝的作品,但我是我需要創建一個函數,以便適用於整個dataframe,類似於:varn < - 1:length(mydf) forfun < - function(x,mydf){0 (mydf [,x],start = 1,stop = 1) m2 < - substr(mydf [,x],start = 2,stop = 2) (varn,1,forfun)但仍然有一些問題... – jon

1

所有R的神祕力量讓你這一點:

  • splitInsert在使用strsplit每個字母拆分柱上,用paste重組它。這被包裹在sapply中以引導該功能。
  • 然後,我使用lapplysplitInsert應用於data.frame的第3:6列,並將data.frame與您不希望修改的兩列組合。
  • 請注意,splitInsert是完全通用的 - 它將適用於任何長度的文本字符串,並且您可以使用任何新字符來重新組合拆分元素。

代碼:

splitInsert <- function(x, split="", new="/"){ 
    sapply(x, function(y) 
    paste(
     strsplit(as.character(y), split=split)[[1]], 
     collapse=new) 
     ) 
} 

data.frame(mydf[, 1:2], lapply(mydf[, 3:ncol(mydf)], splitInsert)) 

結果:

sex ind M1 M2 M3 M4 
1 M I1 a/b 1/2 A/T 2/2 
2 F I2 b/b 2/2 A/G 2/3 
3 F I3 a/c 2/3 A/C 2/4 
4 M I4 a/d 2/4 G/G 1/4 
5 M C d/d 2/5 T/C 2/4 
+0

謝謝...它的作品完美... – jon