2017-05-04 2 views
0

pythonとpandasを使って、辞書オブジェクトのリストから疎なDataFrameを簡単に構築できます。次のコードスニペットは、これはパンダで行うことができる方法を示しています。私は簡単にRでこの現象を再現したい場合はリストリストからスパース行列を構築する

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を使用して同じ結果がPythonでどのように得られるのかを考えてみましょう。

答えて

3

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 
+0

「bind_rows」について知っておくと便利です!確かに非常にエレガントなソリューション。 – LunaticSoul

5

我々はR

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 
2

meltを使用することができます。ここplyrパッケージとソリューションです:あなたはこのようにそれを行うことができdplyr

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 
1

使い方ベースRからconst行列を破棄すると、次のことができます。

まず、今

# 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))))) 

を設定し、マトリックスに記入

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 

になりますが、実際にdata.frameを望んでいた場合、次のことができますas.data.frameまたはdata.frame関数を使用して行列を変換します。

関連する問題