У меня есть кадр данных с людьми, которым присвоен текстовый идентификатор, который объединяет название места с личным идентификатором (см. данные ниже). В конечном итоге мне нужно преобразовать набор данных из «длинного» в «широкий» (например, с помощью «изменить форму»), чтобы каждый человек содержал только одну строку. Для этого мне нужно назначить переменную «время», которую reshape может использовать для идентификации изменяющихся во времени ковариат и т. д. У меня есть (вероятно, плохой) код, чтобы сделать это для отдельных лиц, которые повторяются до двух раз, но мне нужно быть в состоянии идентифицировать до 18 повторяющихся вхождений. Приведенный ниже код отлично работает, если я удаляю строку, перед которой стоит хеш, но идентифицирует только до двух повторений. Если я оставлю эту строку (что кажется необходимым для индивидуумов, повторяющихся более двух раз), 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
}