переформатирование фрейма данных со списком в R - PullRequest
1 голос
/ 14 апреля 2011

Здравствуйте, я пытаюсь изменить форму data.frame в R таким образом, чтобы каждая строка повторялась с другим значением из списка, а затем следующая строка повторялась бы с отличающимся значением от второй записи списка.

список называется, wrk, dfx - это фрейм данных, который я хочу изменить, а listOut - это то, чем я хочу закончить. Большое спасибо за вашу помощь.

> wrk
[[1]]
 [1] "41"  "42"  "44"  "45"  "97"  "99"  "100" "101" "102"
[10] "103" "105" "123" "124" "126" "127" "130" "132" "135"
[19] "136" "137" "138" "139" "140" "141" "158" "159" "160"
[28] "161" "162" "163" "221" "223" "224" ""   

[[2]]
 [1] "41"  "42"  "44"  "45"  "98"  "99"  "100" "101" "102"
[10] "103" "105" "123" "124" "126" "127" "130" "132" "135"
[19] "136" "137" "138" "139" "140" "141" "158" "159" "160"
[28] "161" "162" "163" "221" "223" "224" ""  

>dfx
  projectScore highestRankingGroup
1        0.8852                   1
2        0.8845                   2

>listOut
  projectScore highestRankingGroup    wrk
1        0.8852                   1    41
2        0.8852                   1    42
3        0.8852                   1    44
4        0.8852                   1    45
5        0.8852                   1    97
6        0.8852                   1    99
7        0.8852                   1   100
8        0.8852                   1   101
...
35       0.8845                   2    41
36       0.8845                   2    42
37       0.8845                   2    44
38       0.8845                   2    45
39       0.8845                   2    98
40       0.8845                   2    99
41       0.8845                   2   100

Ответы [ 3 ]

2 голосов
/ 15 апреля 2011

Как насчет повторяющихся строк dfx и cbind с unlist ed wrk:

listOut <- cbind(
    dfx[rep(seq_along(wrk), sapply(wrk, length)), ],
    wrk = unlist(wrk)
)
2 голосов
/ 15 апреля 2011

Как насчет:

Если wrk содержит простые векторы, как в вашем примере:

> szs<-sapply(wrk, length)

> fulldfr<-do.call(c, wrk)    

> listOut<-cbind(dfx[rep(seq_along(szs), szs),], fulldfr)

Если wrk содержит фреймы данных:

> szs<-sapply(wrk, function(dfr){dim(dfr)[1]})

> fulldfr<-do.call(rbind, wrk)

> listOut<-cbind(dfx[rep(seq_along(szs), szs),], fulldfr)
1 голос
/ 14 апреля 2011

Как насчет:

expand.grid(dfx$projectScore, dfx$highestRankingGroup, wrk[[1]])

Edit: Может быть, вы можете добавить еще немного, потому что это, кажется, работает:

a <- c("41","42","44","45","97","99","100","101","102","103","105", "123","124","126","127","130","132","135","136","137","138","139","140","141","158","159","160","161","162","163","221","223","224")
wrk <-list(a, a)
dfx <- data.frame(projectScore=c(0.8852, 0.8845), highestRankingGroup=c(1,2))
listOut <- expand.grid(dfx$projectScore, dfx$highestRankingGroup, wrk[[1]])
names(listOut) <- c("projectScore", "highestRankingGroup", "wrk")
listOut[order(-listOut$projectScore,listOut$highestRankingGroup, listOut$wrk),]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...