我有一个包含138个表的列表(prop.table)
。每个表中最多可包含20个变量(数字类别从11-95作为组合名称)。我需要将此列表转换为主数据帧。前三个表格如下:
[[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
我需要将其转换为矩阵,因此它看起来像这样,当分类变量不可用时,NAs或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))
有关如何解决此问题并获取我需要的表格的任何建议?
答案 0 :(得分:2)
这是你想要的吗?
x1 <- c(1, 5, 7)
names(x1) <- 1:3
x2 <- c(1, 2, 7)
names(x2) <- c(1,3,5)
l <- list(x1, x2)
m <- matrix(nrow=length(l), ncol=5)
colnames(m) <- 1:5
for (i in 1:length(l)) {
m[i, names(l[[i]])] <- l[[i]]
}
也许有人可以用apply
函数替换循环,但我不确定......基本上,我遍历列表并在矩阵的每一行中设置那些与名称匹配的列列表中的向量。
很抱歉没有使用您的数据集,但您手边没有代码,而且我太懒了,无法输入。
答案 1 :(得分: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
中的plyr
功能,该功能仅为rbind
,但会使用NA
填充缺少的列。它可以将rbind
的数据框列表放在一起,因此我首先将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))]
)
答案 2 :(得分: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
一旦你只有一个数据框。您可以使用重塑功能。像
install.packages('reshape')
library('reshape')
cast(MyDataFrame, variable1~variable2)
答案 3 :(得分:1)
这不是效率最高的,而是使用plyr
和reshape2
,并假设您的prop.tables
列表被称为foo
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]} ))
答案 4 :(得分:1)
以下是使用lapply
,rbind
和do.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