表示R中的一组非均匀大小的数据帧

时间:2013-06-15 15:40:57

标签: r dataframe

我有一个数据源,可以表示为30个数据帧的列表(我说的是数据帧,但是如果存在更好的结构,可以随意回答 - 还没有编写任何内容)。每个数据帧与另一个数据帧没有任何直接关系,但每个数据帧有3列和n行。第1列是标签,第2列和第3列是值(总是数字)。

对于有形性,假设每个数据框都是在聚会上吃的食物清单,每列代表Alice和Bob吃的每个项目的数量。

例如

A = [5 x 3] # (apples, pears, cookies, grapes, watermelon)
            # ---------------------------------------------------
            # item           Alice     Bob
            # apples           3        7
            # pears            1        2
            # cookies         10        4   
            # grapes         238      483
            # watermelon       0        1 
            # ---------------------------------------------------

B = [1 x 3] # (grapes)
C = [3 x 3] # (beef, rice, apples)
...
Z = [4 x 3] # (rice, grapes, watermelon, beef)

我想将这些矩阵表示为数据结构,以便我可以询问

  • 所有项目的一般问题 - 例如Alice和Bob中的哪一个整体吃了大概,他们的平均值,标准差等等是什么
  • 标记特定问题 - 例如爱丽丝和鲍勃最喜欢哪种葡萄?

每当我遇到这种问题时,我总是写出包含列表列表的非常丑陋的代码,需要[]运算符或as.matrix() / as.list() / as.dataframe()功能,通常看起来像一个非常糟糕的做事方式。

对于这类数据,什么是goood / best方法?

1 个答案:

答案 0 :(得分:4)

根据@ Arun的评论,您可以轻松创建一个数据框,其中另一列显示相关方:

A = read.table(text="item           Alice     Bob
                     apples           3        7
                     pears            1        2
                     cookies         10        4   
                     grapes         238      483
                     watermelon       0        1", header=T)

B = read.table(text="item           Alice     Bob 
                     grapes          13       26", header=T)

C = read.table(text="item           Alice     Bob 
                     beef             1        3
                     rice             1        2
                     apples           1        0", header=T)

Z = read.table(text="item           Alice     Bob 
                     rice             2        1
                     grapes          10       15
                     watermelon       1        0
                     beef             0        2", header=T)

A$party = "A";    B$party = "B";    C$party = "C";    Z$party = "Z"
dframe = rbind(A, B, C, Z)

从那里,你可以毫无困难地获得列的功能:

apply(dframe[,2:3], 2, sum)

如果您想处理单个项目,并且双方之间存在重复项,则可以对原始数据框执行joins。在R here中执行此操作有一个SO线程。