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 (ファイルの終わり) の 2 つの文字の間に「/」マークを導入したいと思います。

       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

申し訳ありませんが、続行する方法がわかりませんでした...あなたの助けに感謝します...

4

3 に答える 3

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
于 2011-09-11T19:46:37.747 に答える
1

R のすべての不可解な力により、次のことが得られます。

  • splitInsertを使用して各文字で列を分割し、strsplitで再結合しpasteます。これはsapply、関数をベクトル化するためにラップされます。
  • 次に、data.frame の列 3:6lapplyに適用し、それを変更したくない 2 つの列と結合します。splitInsertdata.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
于 2011-09-11T19:38:58.707 に答える
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"
于 2011-09-11T19:30:36.090 に答える