1

私は次のデータを持っています:

set.seed(123)
M1 <- c(sample(c("AA", "AB", "BB"), 5, replace = T))
M2k <- c(sample (c("AG", "GG", "AA"), 5, replace = T))
M3l <- c(sample (c("AT", "TT", "AA"), 5, replace = T))
M4  <- c(sample (c("CT", "TT", "CC"), 5, replace = T))

  #in real data M1 .......M1000 

myd <- data.frame (M1, M2k, M3l, M4)

各Mを2つのM1a、M1の場合はM1b、M2kaの場合はM2kb、M2kの場合はM2kbなどに分割します。同様に、セルの内容は分割されます。ABはM1a列のAと別のM1b列になります。また、A = 1、B = 2、C = 3、G = 4、T = 5、else=NAを再コーディングしたいと思います。

4

4 に答える 4

4

編集 reshape::colsplitはによって分割されます''

を使用しreshape::colsplitます。

library(reshape)

split_col <- function(.col, data){
 .x <- colsplit( data[[.col]], names =  paste0(.col, letters[1:2])) 

}

# split each column and combine
new_data <- do.call(cbind,lapply(names(myd), split_col, data = myd))
# convert each new column to a factor  with levels 1:5 as requested.
new_data_2 <- do.call(data.frame, 
  lapply(new_data, factor, levels = c('A','B','C','G','T'), labels= 1:5))

  M1a M1b M2ka M2kb M3la M3lb M4a M4b
1   1   1    1    4    1    1   3   3
2   2   2    4    4    5    5   3   5
3   1   2    1    1    1    1   3   5
4   2   2    4    4    5    5   3   5
5   2   2    4    4    1    5   3   3
于 2012-07-03T05:01:41.427 に答える
0

これが別の可能な解決策ですが、私が簡単にフォローできることを除いて、特に利点はありません。

myd$M5 = c("AB", "GT", "GA", "QW", "CK") # Add another test column.

mat = as.matrix(myd) # Convert to matrix for speed and indexing benefits.

# Construct new column names.
new_names = character(length=ncol(mat) * 2)
new_names[seq(1, ncol(mat) * 2, 2)] = paste(colnames(mat), "a", sep="")
new_names[seq(2, ncol(mat) * 2, 2)] = paste(colnames(mat), "b", sep="")

# Create empty matrix with correct column names.
newmat = matrix(ncol=ncol(mat) * 2, nrow=nrow(mat))
colnames(newmat) = new_names

# Split columns.
for (i in seq(1, ncol(mat))) {
    newmat[, (i * 2) - 1] = substr(mat[, i], 1, 1)
    newmat[,  i * 2     ] = substr(mat[, i], 2, 2)
}

# Use named vector to recode data.
recode = c(A=1, B=2, C=3, G=4, T=5)
newmat[] = recode[newmat]

newmat
#      M1a M1b M2ka M2kb M3la M3lb M4a M4b M5a M5b
# [1,] "1" "1" "1"  "4"  "1"  "1"  "3" "3" "1" "2"
# [2,] "2" "2" "4"  "4"  "5"  "5"  "3" "5" "4" "5"
# [3,] "1" "2" "1"  "1"  "1"  "1"  "3" "5" "4" "1"
# [4,] "2" "2" "4"  "4"  "5"  "5"  "3" "5" NA  NA 
# [5,] "2" "2" "4"  "4"  "1"  "5"  "3" "3" "3" NA 
于 2012-07-03T07:37:41.730 に答える
0

mnelはすでにかなり簡単な答えを出しました。これは、まだCRANにはないが、GitHubにある処理中のパッケージ(qdap)で遊んでいる私です。

qdapをインストールするには

# install.packages("devtools")
library(devtools)
install_github("qdap", "trinker")

問題の解決:

lapply(seq_along(myd),  function(i){
    myd <<- colsplit2df(myd, (i+i-1), paste0(names(myd)[i+i-1], 
        letters[1:2]), sep="")
})

data.frame(apply(myd, 2, function(x) as.numeric(text2color(x, 
    c("A", "B", "C", "G", "T"), c(1:5, NA)))))

このコードの主力はcolsplit2df(data.frameを返す)とtext2col(wordcloudの色付けのためにテキストを再コード化するように設計されています。実際には辞書検索ツールです)。これは実際にはこれらの機能が行うように設計されているものではなく、単にそれらを拡張する方法を再生して確認するだけです。

于 2012-07-03T13:21:51.973 に答える
0

より安定したソリューションでqdapを使用する:

x <- colsplit2df(myd, 1:ncol(myd), sep="")
colnames(x) <- paste(rep(colnames(myd), each = 2), letters[1:2], sep=".")

##   M1a M1b M2ka M2kb M3la M3lb M4a M4b
## 1   1   1    1    4    1    1   3   3
## 2   2   2    4    4    5    5   3   5
## 3   1   2    1    1    1    1   3   5
## 4   2   2    4    4    5    5   3   5
## 5   2   2    4    4    1    5   3   3
于 2014-02-26T23:55:23.207 に答える