добавить идентификатор к каждой строке кадра данных до / после использования ldpy, чтобы объединить список данных в один - PullRequest
3 голосов
/ 02 апреля 2012

У меня есть дополнительный вопрос, основанный на этом одном .

Я использовал df <- ldply(listOfDataFrames, data.frame) для объединения списка из более чем 12000 фреймов данных, но, поскольку каждый фрейм данных в списке не имеет идентификатора, мне нужно знать, какой фрейм данных берется из какого списка.

Я знаю, что могу использовать ldply(test,nrow) для создания другого фрейма данных, а затем использовать for-loop для добавления имени списка, но это кажется немного медленным, интересно, есть ли более быстрый метод. Благодаря.

Ответы [ 3 ]

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

Полагаю, в вашем распоряжении также есть reshape2.Я обычно подхожу к этому с melt:

library(reshape2)
#Thanks Roman
a <- list(data.frame(a=runif(5), b=runif(5)), data.frame(a=runif(5), b=runif(5)), data.frame(a=runif(5), b=runif(5)))
melt(a)

> melt(a, id.vars = 1:2)
          a        b L1
1  0.325542 0.914199  1
2  0.947871 0.719881  1
3  0.683925 0.574832  1
4  0.715612 0.646920  1
...
2 голосов
/ 02 апреля 2012

У меня нет для вас решения plyr, но именно так я обычно делаю это в базе R.

> a <- list(data.frame(a=runif(5), b=runif(5)), data.frame(a=runif(5), b=runif(5)), data.frame(a=runif(5), b=runif(5)))
> a
[[1]]
          a         b
1 0.2994804 0.2681471
2 0.3223587 0.3663688
3 0.2662296 0.2941038
4 0.8041538 0.2991932
5 0.6860321 0.0872916

[[2]]
           a          b
1 0.84966749 0.01750988
2 0.19320093 0.05274077
3 0.63218616 0.77222663
4 0.00773626 0.53163878
5 0.19965884 0.50740204

[[3]]
          a          b
1 0.2915164 0.65905466
2 0.5676906 0.01094598
3 0.5689014 0.58943383
4 0.7937997 0.75535177
5 0.2304010 0.84012697

> indices <- lapply(a, nrow)
> a.all <- do.call(rbind, a)
> a.all$index <- rep(1:length(a), indices)
> a.all
            a          b index
1  0.29948042 0.26814714     1
2  0.32235868 0.36636880     1
3  0.26622956 0.29410382     1
4  0.80415381 0.29919316     1
5  0.68603208 0.08729160     1
6  0.84966749 0.01750988     2
7  0.19320093 0.05274077     2
8  0.63218616 0.77222663     2
9  0.00773626 0.53163878     2
10 0.19965884 0.50740204     2
11 0.29151644 0.65905466     3
12 0.56769063 0.01094598     3
13 0.56890138 0.58943383     3
14 0.79379972 0.75535177     3
15 0.23040098 0.84012697     3
1 голос
/ 02 апреля 2012

Опять же, используя базу R, вы можете назвать элементы списка:

# Also thank you Roman
a <- list(data.frame(a=runif(5), b=runif(5)), data.frame(a=runif(5),
  b=runif(5)), data.frame(a=runif(5), b=runif(5)))
names(a)<-seq_along(a)

myAns<-do.call("rbind",a)

Тогда имена строк соответствуют именам элементов списка.

row.names(myAns)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...