2

我有一个数据源,可以表示为可能包含 30 个数据帧的列表(我说的是数据帧,但如果存在更好的结构,请随时使用它来回答 - 尚未编写任何内容)。每个数据框与其他数据框没有任何直接关系,但每个数据框都有 3 列和 n 行。第 1 列是标签,第 2 列和第 3 列是值(总是数字)。

为了有形性,假设每个数据帧是聚会上吃的食物列表,每一列代表爱丽丝和鲍勃吃的每件物品的数量。

例如

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 中的哪一个总体上吃了最多的项目,他们的平均值是多少,标准偏差等
  • 标注具体问题——例如 Alice 和 Bob 中的哪一个最多葡萄?

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

对于这类数据,什么是好的/最好的方法?

4

1 回答 1

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)

如果您想处理单个项目,并且它们在各方之间有重复项,您可以对原始数据框执行连接。这里有一个关于在 R 中执行此操作的 SO 线程。

于 2013-06-15T18:49:04.117 回答