0

次のようにリストされているデータセットがあります。

.

data <- structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("I", "II", "III"), class = "factor"), 
    time = c(1L, 1L, 1L, 2L, 2L, 3L, 1L, 1L, 1L, 2L, 2L, 1L, 
    2L, 2L, 2L), species = structure(c(1L, 2L, 3L, 2L, 4L, 1L, 
    3L, 2L, 1L, 3L, 4L, 1L, 1L, 3L, 4L), .Label = c("a", "b", 
    "c", "d"), class = "factor")), .Names = c("group", "time", 
"species"), class = "data.frame", row.names = c(NA, -15L))
head(data)


##     group time species
## 1     I    1       a
## 2     I    1       b
## 3     I    1       c
## 4     I    2       b
## 5     I    2       d
## 6     I    3       a

同じ時間ブロックで共起する種の共起テーブルを作成しています。ここに例示するコードは、グループ I で見つかった種の共起表を作成します。

data2=subset(data,data$group=="I")    
X =table(data2$species,data2$time)    
X <- as.matrix(X)    
out <- X %*% t(X)

write.table(out,"coocurrence_groupI.txt",sep="\t")

元のデータ セットには、実際には大量のグループがあります。それぞれをサブセット化してから .txt ファイルを作成するのは冗長すぎるようです。私の質問は、各グループ (例では I、II、および III) の共起テーブルを自動的に作成し、それぞれに異なる .txt ファイルを書き込むループ関数を作成するにはどうすればよいですか?

私はインターネットを精査しましたが、sapply を除いて、近いものは見つかりませんでした (これが正しい操作であるかどうかは完全にはわかりません)。たぶん、私は適切な場所を見ていませんでした。どんな助けでも大歓迎です。

カムクロス

4

1 に答える 1

1

split applymnelが指摘しているように、代替手段があるとはいえ、私はこの種の問題を解決する方法に部分的です。

以下に示すように、行列を関数に変換してから、データをグループごとに分割し、その関数を各グループにラップします。

#your data renamed dat (data is an R function so avoid using that as a name
dat <- structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("I", "II", "III"), class = "factor"), 
    time = c(1L, 1L, 1L, 2L, 2L, 3L, 1L, 1L, 1L, 2L, 2L, 1L, 
    2L, 2L, 2L), species = structure(c(1L, 2L, 3L, 2L, 4L, 1L, 
    3L, 2L, 1L, 3L, 4L, 1L, 1L, 3L, 4L), .Label = c("a", "b", 
    "c", "d"), class = "factor")), .Names = c("group", "time", 
"species"), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"
))

#your processing turned into a function
FUN <- function(DATA) {
    X <- table(DATA[, 2],DATA[, 1])    
    X <- as.matrix(X)    
    X %*% t(X)
}

#the split lapply method
X <- split(dat[, 2:3], dat[, 1])    
lapply(X, FUN)

これにより、次の結果が得られます。

$I

    a b c d
  a 2 1 1 0
  b 1 2 1 1
  c 1 1 1 0
  d 0 1 0 1

$II

    a b c d
  a 1 1 1 0
  b 1 1 1 0
  c 1 1 2 1
  d 0 0 1 1

$III

    a b c d
  a 2 0 1 1
  b 0 0 0 0
  c 1 0 1 1
  d 1 0 1 1

編集:それぞれをファイルに書き出す必要があったことをお詫びします。私はこれを行いましたが、複数のtxtファイルを書くのではなく、上記の関数の出力でsaveor関数を検討することをお勧めします:saveRDS

v <- split(dat[, 2:3], dat[, 1])    
Output <- lapply(seq_along(v), function(i) {
        X <- table(v[[i]][, 2], v[[i]][, 1])    
        X <- as.matrix(X)    
        z <- X %*% t(X)
        write.table(z, paste0("coocurrence_group", names(v)[i], ".txt"),sep="\t")
        return(z)
    }
)

names(Output) <- names(v)
Output
于 2012-08-13T23:28:03.220 に答える