列出NA或0的数据帧

时间:2013-04-10 00:11:47

标签: r list matrix dataframe

我有一个包含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))

有关如何解决此问题并获取我需要的表格的任何建议?

5 个答案:

答案 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)

这不是效率最高的,而是使用plyrreshape2,并假设您的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)

以下是使用lapplyrbinddo.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