добавить значения во фрейм данных с помощью cbind - PullRequest
0 голосов
/ 02 апреля 2012

у меня есть датафрейм с именем glen, который имеет эту форму (это часть ее)

  X   Y  Z
 334 213 A  
 123 342 B  
 324 344 C  
 234 231 D  
 643 575 E

Я применяю функцию к этим данным, которая будет генерироваться для каждого значения нескольких строк Z.

for(i in 1:nrow(glen))
{
fin <-  cbind(fin,name=glen[i,]$Z, ...ETC)

}

поэтому вывод fin должен выглядеть примерно так:

Z V1 V2
A  5 6
A  1 4
A  4 2
A  8 6
B  2 7
B  5 4
C  2 4
C  9 5

но после завершения цикла for у меня есть только последние значения фрейма данных fin:

C  2 4
C  9 5

что я должен сделать, чтобы заполнить все значения внутри фрейма данных fin.

спасибо

1 Ответ

1 голос
/ 02 апреля 2012

Не имея возможности точно определить, как вы получили значения от glen до значений в fin (кто-то может дать мне знать, какое простое отображение я слишком медленно получал), вот предложение:

glen <- data.frame(X=c(334,123,324,234,643),Y=c(213,342,344,231,575),
  Z=c("A","B","C","D","E"))

finList <- apply(glen, 1, function(x) {
  myName <- x["Z"]
  myVal1 <- as.numeric(x["X"])-c(1:4)
  myVal2 <- 5:8
  return(data.frame(Z = rep(myName, length(myVal1)), V1 = myVal1, V2 = myVal2))
})

fin <- do.call("rbind", finList)

Как правило, лучше избегать выращивания объекта в цикле for, особенно если glen имеет много строк.

Кроме того, вы cbind получаете результатыкаждой итерации в цикле for, но пример fin выглядит так, как будто вы действительно хотите rbind.

Кроме того, каждое значение glen$Z уникально?

РЕДАКТИРОВАТЬ

Добавлена ​​строка в apply, чтобы показать расчет на основе Глен.Объект x в анонимной функции, вызванной в apply, является частью glen, которая передается функции.Вы даже можете выполнять вычисления на основе всего набора данных glen внутри функции, но было бы очень полезно узнать, какие вычисления вы хотите выполнить для каждой строки.

EDIT 2

Вот пример, который рассматривает комментарий ниже о дополнительной таблице df:

df<-data.frame(begin=rep(glen$X,each=5),
  finish=glen$Y-sample(-10:10,5*nrow(glen),replace=TRUE),
  Val1=rnorm(5*nrow(glen)))

finList <- apply(glen, 1, function(x) {
  myName <- x["Z"]
  myVal1 <- subset(df, begin==x["X"]&finish<=x["Y"])$Val1
  return(data.frame(Z = rep(myName, length(myVal1)), V1 = myVal1))
})

fin <- do.call("rbind", finList)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...