1

各列が動物の求愛中のさまざまな行動を表す時系列の数字(0から8)であるデータフレームがあります。ある行動の後に別の行動が続くようなパターンがあるかどうかを確認したいと思います。特定の時間間隔の後、特定の動作に続く動作の頻度を計算できる関数を作成しました。

> data[,3]
  [1]  1  1  1  1  7  7  3  3  7  3  1  1  8  1  3  3  3  5  1  1  4 ... 

neighbor <- function(DATA, BEHAVIOR, INTERVAL)
{
total=c(0)
tmp = data.frame(total=c(0:8),Freq=rep(0,9))
number_of_x = which(DATA == BEHAVIOR)

for(i in number_of_x){
              total = append(total,DATA[i+INTERVAL,])
}
tmp = merge(tmp,table(total), by=c("total"), all=T)
tmp[is.na(tmp)] <- 0
subset(tmp, select = ncol(tmp))
}

したがって、たとえば3番目の列、動作3、および時間内の次の動作(1)の関数を実行すると、必要なものが得られます。

> neighbor(as.data.frame(data[,3], 3, 1]
Freq.y
0 0.01
1 0.71
2 0.01
3 0.21
4 0.01
5 0.04
6 0.01
7 0.02
8 0.00

ここで、同様の関数を使用して、9つの動作の頻度を取得したいと思います。何かのようなもの:

neighborAll <- function(DATA, INTERVAL)
{
total=c(0)
tmp = data.frame(total=c(0:8),Freq=rep(0,9))
for(a in c(0:8)){
number_of_x = which(DATA == a)
for(i in number_of_x){
      total = c(total,DATA[i+INTERVAL,])
}
tmp=merge(tmp, table(total), by = c("total"), all=T)
tmp[is.na(tmp)] <- 0
}
tmp[,3:9]
}

> neighborAll(as.data.frame(data[,3], 1)

私は得る:

Error in merge.data.frame(tmp, table(total), by = c("total"), all = T) : 
  there is already a column named ‘Freq.x’

どんなアイデアでも歓迎します。よろしくお願いします、ホセ

4

2 に答える 2

1

基本的にこれが必要です:

neighborAll <- function(DATA, INTERVAL, TABLE)
{
    for(i in 1:(nrow(TABLE) - 1))
    {
        neighbors <- DATA[which(DATA == i) + INTERVAL]
        tab <- table(neighbors)
        TABLE[TABLE$behavior %in% names(tab), i + 2] <- tab
    }
    return(TABLE)
}

x<-c(1, 1, 1, 1, 7, 7, 3, 3, 7, 3, 1, 1 ,8, 1, 3, 3, 3, 5, 1, 1, 4)

behavior <- 0:8
n <- length(behavior)
tmp <- matrix(nrow=n, ncol=n)
colnames(tmp) <- paste("freq", behavior, sep="")
freqtab <- data.frame(behavior, tmp)

neighborAll(x, 1, freqtab)
于 2012-05-22T13:24:36.613 に答える
0

名前を正しくするためではなかった場合、これらのそれぞれがワンライナーである可能性があります。

neighbor <- function(DATA, BEHAVIOR, INTERVAL) {
  nbins <- 1+max(0, DATA, na.rm = TRUE)
  out <- tabulate(1+DATA[which(DATA==BEHAVIOR)+INTERVAL], nbins=nbins)
  names(out) <- 1:nbins - 1
  out
}

neighborAll <- function(DATA, INTERVAL) {
  out <- sapply(0:max(DATA, na.rm=TRUE), 
         function(BEHAVIOR) neighbor(DATA, BEHAVIOR, INTERVAL))
  colnames(out) <- 0:max(DATA, na.rm=TRUE)
  out
}

> x <- c(1, 1, 1, 1, 7, 7, 3, 3, 7, 3, 1, 1 ,8, 1, 3, 3, 3, 5, 1, 1, 4)

> neighbor(x,3,1)
0 1 2 3 4 5 6 7 8 
0 1 0 3 0 1 0 1 0 

> neighborAll(x,1)
  0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 5 0 1 0 1 0 0 1
2 0 0 0 0 0 0 0 0 0
3 0 1 0 3 0 0 0 2 0
4 0 1 0 0 0 0 0 0 0
5 0 0 0 1 0 0 0 0 0
6 0 0 0 0 0 0 0 0 0
7 0 1 0 1 0 0 0 1 0
8 0 1 0 0 0 0 0 0 0
于 2012-05-22T13:55:17.583 に答える