1

場所名と個人IDを連結するテキストIDが割り当てられた個人のデータフレームがあります(以下のデータを参照)。最終的には、データセットを「長い」から「広い」に変換して(たとえば、「形状変更」を使用して)、各個人が1つの行のみで構成されるようにする必要があります。そのためには、reshapeが時変共変量などを識別するために使用できる「時間」変数を割り当てる必要があります。2回まで繰り返す個人に対してこれを行うための(おそらく悪い)コードがありますが、最大18回の繰り返し発生を識別できます。以下のコードは、ハッシュの前にある行を削除すると正常に機能しますが、最大2つの繰り返ししか識別しません。私がその行を残しておくと(これは、2回以上繰り返される個人にとって必要と思われる)、Rは窒息し、

Error in if (data$uid[i] == data$uid[i - 2]) { : 
  argument is of length zero

誰かがこれを手伝うことができますか?前もって感謝します!

place <- rep("ny",10)
pid <- c(1,1,2,2,2,3,4,4,5,5)
uid<- paste(place,pid,sep="")
time <- rep(0,10)
data <- cbind(uid,time)
data <- as.data.frame(data)
data$time <- as.numeric(data$time)

#bad code
data$time[1] <- 1 #need to set first so that loop doesn't go to a row that doesn't exist     (i.e., row 0)
for (i in 2:NROW(data)){
    data$time[i] <- 1 #set first occurrence to 1
    if (data$uid[i] == data$uid[i-1]) {data$time[i] <- 2} #set second occurrence to 2, etc.
    #if (data$uid[i] == data$uid[i-2]) {data$time[i] <- 3}
    i <- i+1
}
4

4 に答える 4

2

何をしようとしているのかは不明ですが、一意の行ごとに各行uid時間インデックスを作成する必要があると言っていると思います。そうですか?

もしそうなら、これに旋風を与える

library(plyr)
ddply(data, "uid", transform, time = seq_along(uid))

あなたに次のようなものを与えるでしょう:

   uid time
1  ny1    1
2  ny1    2
3  ny2    1
4  ny2    2
5  ny2    3
....
于 2011-10-06T01:51:10.790 に答える
1

これはあなたが考えていることですか?

> d <- data.frame(uid = paste("ny",c(1,2,1,2,2,3,4,4,5,5),sep=""))
> out <- do.call(rbind, lapply(split(d, d$uid), function(x) {x$time <- 1:nrow(x); x}))
> rownames(out) <- NULL
> out
   uid time
1  ny1    1
2  ny1    2
3  ny2    1
4  ny2    2
5  ny2    3
6  ny3    1
7  ny4    1
8  ny4    2
9  ny5    1
10 ny5    2
于 2011-10-06T01:52:11.777 に答える
0

データフレーム設定の使用:

place <- rep("ny",10)
pid <- c(1,1,2,2,2,3,4,4,5,5)
uid<- paste(place,pid,sep="")
time <- rep(0,10)
data <- cbind(uid,time)
data <- as.data.frame(data)

次を使用できます。

data$time <- sequence(table(data$uid))
data

取得するため:

> data
   uid time
1  ny1    1
2  ny1    2
3  ny2    1
4  ny2    2
5  ny2    3
6  ny3    1
7  ny4    1
8  ny4    2
9  ny5    1
10 ny5    2

注:これを機能させるには、最初にdata.frameをuidで並べ替える必要があります。

于 2011-10-12T03:20:51.553 に答える
0

大規模なデータセットで上記のソリューションを試した後、このための独自のループを作成することにしました。それは非常に時間がかかり、それでもデータを50k要素のベクトルに分割する必要がありましたが、最終的には機能しました。

system.time( for(i in 2:length(data$uid)) {
if(data$uid[i]==data$uid[i-1]) data$repeats[i] <- data$repeats[i-1]+1
  if ((i %% 1000)== 0) { #helps to keep track of how far the loop has gotten
    print(i) }
    i+1
}
)

皆様のご協力に感謝いたします。

于 2011-10-26T01:08:42.473 に答える