Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python R-从列表列表构造稀疏矩阵_Python_R_Pandas - Fatal编程技术网

Python R-从列表列表构造稀疏矩阵

Python R-从列表列表构造稀疏矩阵,python,r,pandas,Python,R,Pandas,使用python和pandas,我可以轻松地从字典对象列表构建稀疏数据帧。以下代码片段显示了如何在pandas中完成此操作: In [1]: import pandas as pd; (pd.DataFrame([{'a':1, 'b':10}, {'d':99, 'c':1}, {'b':1, 'd': 4}])

使用python和pandas,我可以轻松地从字典对象列表构建稀疏数据帧。以下代码片段显示了如何在pandas中完成此操作:

In [1]: import pandas as pd; (pd.DataFrame([{'a':1, 'b':10}, 
                                            {'d':99, 'c':1},
                                            {'b':1, 'd': 4}])
                                .fillna(0))
Out[1]: 
     a     b    c     d
0  1.0  10.0  0.0   0.0
1  0.0   0.0  1.0  99.0
2  0.0   1.0  0.0   4.0
如果我想在R中轻松重现这种行为,该怎么办?假设我有以下变量:

values <- list(list(a = 1, b = 10),
               list(d = 99, c = 1),
               list(b = 1, d = 4))

值我们可以在
R
中使用
melt
xtabs

library(reshape2)
xtabs(value~L1 + L2, melt(values))
#     L2
#L1   a  b  c  d
#  1  1 10  0  0
#  2  0  0  1 99
#  3  0  1  0  4

以下是一个带有
plyr
软件包的解决方案:

ldply(values, data.frame)

   a  b  d  c
1  1 10 NA NA
2 NA NA 99  1
3 NA  1  4 NA


# mutate each to replace NA with 0
ldply(values, data.frame) %>% 
     mutate_each(funs(replace(., is.na(.), 0)))

  a  b  d c
1 1 10  0 0
2 0  0 99 1
3 0  1  4 0

使用
dplyr
您可以这样做:

library(dplyr)
values %>% bind_rows() %>% mutate_all(function(x) coalesce(x, 0))

# A tibble: 3 × 4
      a     b     d     c
  <dbl> <dbl> <dbl> <dbl>
1     1    10     0     0
2     0     0    99     1
3     0     1     4     0
库(dplyr)
值%>%bind_rows()%%>%mutate_all(函数(x)合并(x,0))
#一个tibble:3×4
a、b、d、c
1     1    10     0     0
2     0     0    99     1
3     0     1     4     0

使用base R构造矩阵,可以执行以下操作

首先,建立

# flatten list to pull out info for matrix construction
flat <- unlist(values)
# build a 0 matrix with correct dimensions and column names
myMat <- matrix(0, nrow=length(values), ncol=length(unique(names(flat))),
                dimnames=list(NULL, sort(unique(names(flat)))))

如果您确实需要data.frame,可以使用
as.data.frame
data.frame
函数转换矩阵。

很高兴了解
绑定行
!非常优雅的解决方案。
for(i in seq_along(values)) myMat[i, names(values[[i]])] <- unlist(values[[i]])
myMat
     a  b c  d
[1,] 1 10 0  0
[2,] 0  0 1 99
[3,] 0  1 0  4