1

138 個のテーブルを含むリストがあり(prop.table)ます。各テーブルには最大 20 個の変数を含めることができます (列名として 11 から 95 の範囲の数値カテゴリ)。このリストをマスター データフレームに変換する必要があります。最初の 3 つのテーブルは次のようになります。

[[1]]
x
        21         41         42         43         52         71         81         82 
0.02007456 0.58158876 0.22483510 0.09349011 0.05248064 0.01204474 0.00544881 0.01003728 

[[2]]
x
        21         41         42         43         52         71         90 
0.01175122 0.36973345 0.34107194 0.03066781 0.08655775 0.01633706 0.14388077 

[[3]]
x
         21          22          23          41          42 
0.043254082 0.008307075 0.016614151 0.930392438 0.001432254 

これを行列に変換する必要があるので、カテゴリ変数が使用できない場合は NA または 0 で、次のようになります。

x<-matrix (nrow=3, ncol=11 )
colnames(x) <-c('21', '22', '23', '41', '42', '43', '52', '71', '81', '82', '90' )

以前の同様の質問からこの行を使用しようとしましたが、表が正しくありません:

df <- data.frame(matrix(unlist(prop.table), nrow=138, byrow=T))

この問題を解決して必要なテーブルを取得する方法について何か提案はありますか?

4

5 に答える 5

2

rbind.fillパッケージからplyrこれを行います:

# make an example `prop.table`:
tbl <- 1:10
names(tbl) <- letters[1:10]
tbl <- as.matrix(tbl)

# make sure some of the columns are missing
prop.table <- list(tbl[sample(10, size=8),], tbl[sample(10, size=7),], tbl[sample(10, size=9),])
# [[1]]
# d b g c h f e i 
# 4 2 7 3 8 6 5 9 
# [[2]]
#  h  g  d  a  j  f  c 
#  8  7  4  1 10  6  3 
# [[3]]
#  c  i  b  d  j  a  h  g  e 
# 3  9  2  4 10  1  8  7  5 

rbind.fill関数 fromを使用できますがplyr、これはrbind不足している列を で埋めますNArbindデータフレームのリストを一緒に取ることができるのでprop.table、最初に各要素をデータフレームに変換します(各要素が列ではなく行として扱われるtようにする必要があります)prop.table[[i]]

rbind.fill(lapply(prop.table, function (x) as.data.frame(t(x))))
#   d  b g c h  f  e  i  a  j
# 1 4  2 7 3 8  6  5  9 NA NA
# 2 4 NA 7 3 8  6 NA NA  1 10
# 3 4  2 7 3 8 NA  5  9  1 10

(注 - 出力データフレームの列を でソートできますx[, order(colnames(x))])

于 2013-04-10T01:46:54.493 に答える
1

lapplyを使用する簡単な方法を次に示しますrbinddo.call

ptl
## [[1]]
## x
##         21         41         42         43         52         71         81         82 
## 0.02007456 0.58158876 0.22483510 0.09349011 0.05248064 0.01204474 0.00544881 0.01003728 
## 
## [[2]]
## x
##         21         41         42         43         52         71         90 
## 0.01175122 0.36973345 0.34107194 0.03066781 0.08655775 0.01633706 0.14388077 
## 
## [[3]]
## x
##          21          22          23          41          42 
## 0.043254082 0.008307075 0.016614151 0.930392438 0.001432254 
## 
## [[4]]
## x
##         21         22         31         41         42         43         81 
## 0.10028653 0.03123209 0.00487106 0.66103152 0.03037249 0.01604585 0.15616046 
## 
## [[5]]
## x
##           21           41           42           43           81 
## 0.0662080825 0.8291774147 0.0005732302 0.0865577529 0.0174835196 
## 
## [[6]]
## x
##          21          22          31          41          42          43          81 
## 0.081948424 0.002292264 0.006303725 0.825501433 0.029226361 0.020630372 0.034097421 
## 


# Get unique names of all columns in tables in the list
resCol <- unique(unlist(lapply(ptl, names)))

# Get dimensions of desired result
nresCol <- length(resCol)
nresRow <- length(ptl)

# Create 'Template' data.frame row
DF <- as.data.frame(matrix(rep(0, nresCol), nrow = 1, dimnames = list(1, resCol)))

# for every table in list, create copy of DF, fill it appropriately, then rbind result together using do.call

result <- do.call(rbind, lapply(ptl, function(x) {
    retDF <- DF
    retDF[, names(x)] <- x
    return(retDF)
}))

# rename rows(optional)
rownames(result) <- 1:nrow(result)

result
##           21        41           42         43         52         71         81         82        90          22         23          31
## 1 0.02007456 0.5815888 0.2248351018 0.09349011 0.05248064 0.01204474 0.00544881 0.01003728 0.0000000 0.000000000 0.00000000 0.000000000
## 2 0.01175122 0.3697334 0.3410719404 0.03066781 0.08655775 0.01633706 0.00000000 0.00000000 0.1438808 0.000000000 0.00000000 0.000000000
## 3 0.04325408 0.9303924 0.0014322544 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.0000000 0.008307075 0.01661415 0.000000000
## 4 0.10028653 0.6610315 0.0303724928 0.01604585 0.00000000 0.00000000 0.15616046 0.00000000 0.0000000 0.031232092 0.00000000 0.004871060
## 5 0.06620808 0.8291774 0.0005732302 0.08655775 0.00000000 0.00000000 0.01748352 0.00000000 0.0000000 0.000000000 0.00000000 0.000000000
## 6 0.08194842 0.8255014 0.0292263610 0.02063037 0.00000000 0.00000000 0.03409742 0.00000000 0.0000000 0.002292264 0.00000000 0.006303725
于 2013-04-10T02:04:04.433 に答える
1

1つの解決策を提案するだけです。すべてのリストを 1 つに連結してみませんか。だからあなたは持っているでしょう

MyDataFrame
variable1         1          1          1          1          1          1          1          1
variable2        21         41         42         43         52         71         81         82 
variable30.02007456 0.58158876 0.22483510 0.09349011 0.05248064 0.01204474 0.00544881 0.01003728 

variable1         2          2          2          2          2          2          2 
variable2        21         41         42         43         52         71         90 
variable30.01175122 0.36973345 0.34107194 0.03066781 0.08655775 0.01633706 0.14388077 

variable1          3           3           3           3           3
variable2         21          22          23          41          42 
variable30.043254082 0.008307075 0.016614151 0.930392438 0.001432254 

そして、データフレームが1つしかない場合。リシェイプ機能を使用できます。お気に入り

install.packages('reshape')
library('reshape')
cast(MyDataFrame, variable1~variable2)
于 2013-04-10T00:49:26.163 に答える
1

これは最も効率的ではありませんが、 and を使用plyrし、リストが呼び出されるreshape2と仮定しますprop.tablesfoo

library(plyr)
library(reshape2)


allData <- dcast(ldply(lapply(seq_along(foo), function(x) data.frame(foo[[x]], id = x))), 
                id ~ x, value.var = 'Freq')

またはもっと率直に

ff <- c('21', '22', '23', '41', '42', '43', '52', '71', '81', '82', '90' )

t(sapply(foo, function(x,y) {x[ff]} ))
于 2013-04-10T00:50:34.130 に答える