【问题标题】:Data manipulation and structure in RR中的数据操作和结构
【发布时间】:2018-11-28 13:02:57
【问题描述】:

我有一个“Exp”数据集,如下所示:

  Locals   Res   Ind
1    112 7.865 4.248
2    113 4.248 5.666
3    114 5.666 2.444
4    115 2.444 7.865
5    116 7.865 4.248
6    117 4.248 6.983
7    118 5.666 3.867
8    119 2.444 2.987

我还有另一个名为“Com”的数据集,如下所示:

113 112 113
112 114 119
116 118 119
118 118 119
117 117 119
117 117 119

基于“Com”数据集中的值,我提取了一个对应的值作为“Res”和“Indmatrix 的一部分。 例如 - Com 数据集中的第一个值是 113,所以在 Res matrix 中的第一个值将是 4.248 - 因为 Exp 的第一列 113 中的对应值是 4.248。这样 'Res' matrix 看起来像这样

4.248   7.865   4.248
7.865   5.666   2.444
7.865   5.666   2.444
5.666   5.666   2.444
4.248   4.248   2.444
4.248   4.248   2.444

现在基于上面的'Res'数据集,我想用2减去第一个row,用5减去其余的rows。然后我想根据Com数据集的值把上面数据集的值加起来。例如Com数据集中有两个113Res数据集中对应的值为(4.248 - 2) + (4.248 - 2)。所以它等于4.496。输出表应如下所示:

Locals  Dam
112 8.73
113 4.496
114 0.666
115 0
116 2.865
117 -3.008
118 1.998
119 -12.78

任何人都可以建议一种在 R 上执行此操作的简单方法。如果这是在数据列表上完成的,那么最好的方法是什么

提前致谢

【问题讨论】:

    标签: r dataframe matrix data-structures data-manipulation


    【解决方案1】:

    这是一个简单的基础方法,可以让你快到那里:

    Res = matrix(Exp$Res[match(Com, Exp$Locals)], nrow = nrow(Com))
    
    subtract = Res
    subtract[] = 5
    subtract[1, ] = 2
    
    Res = Res - subtract
    output = data.frame(Locals = as.vector(Com), Dam = as.vector(Res))
    output
    #    Locals    Dam
    # 1     113  2.248
    # 2     112  2.865
    # 3     116  2.865
    # 4     118  0.666
    # 5     117 -0.752
    # 6     117 -0.752
    # 7     112  5.865
    # 8     114  0.666
    # 9     118  0.666
    # 10    118  0.666
    # 11    117 -0.752
    # 12    117 -0.752
    # 13    113  2.248
    # 14    119 -2.556
    # 15    119 -2.556
    # 16    119 -2.556
    # 17    119 -2.556
    # 18    119 -2.556
    

    此时,我们只需要按组求和即可。有很多方法可以做到这一点,我鼓励您从How to sum a variable by group? 的常见问题解答中选择您最喜欢的方法。为了避免外部依赖,这里有一种使用内置函数aggregate 的方法:

    aggregate(Dam ~ Locals, data = output, FUN = sum)
    #   Locals     Dam
    # 1    112   8.730
    # 2    113   4.496
    # 3    114   0.666
    # 4    116   2.865
    # 5    117  -3.008
    # 6    118   1.998
    # 7    119 -12.780
    

    此时,如果您确实需要1150 条目,您可以加入data.frame(Local = unique(Exp$Locals)) 或使用tidyr::complete 来填补漏洞。我将把它作为练习留给读者。

    如果这是在数据列表上完成的,那么最好的方法是什么

    如果您想对数据框列表执行此操作,请将其转换为函数。如果您对此有疑问,请在list 中提出一个提供合适示例输入的新问题 - 我目前不确定您是否要使用ExpCom 或两者的列表,所以我不会在这里猜测。


    使用此数据作为输入:

    Exp = read.table(text = "  Locals   Res   Ind
    1    112 7.865 4.248
    2    113 4.248 5.666
    3    114 5.666 2.444
    4    115 2.444 7.865
    5    116 7.865 4.248
    6    117 4.248 6.983
    7    118 5.666 3.867
    8    119 2.444 2.987", header = T)
    
    Com = as.matrix(read.table(text = "113 112 113
    112 114 119
    116 118 119
    118 118 119
    117 117 119
    117 117 119"))
    

    【讨论】:

      【解决方案2】:

      这个练习可以通过多种方式解决,我将使用一些可能会用到的基本 R 函数来演示一个。

      • 首先是 Res 矩阵,我们可以用 for 循环和下面的方法来创建它。

        Resm

      • 减法只是简单的矩阵减法

        subM

      • 最后的答案是一个基于 com 中的索引应用于 Res 矩阵的函数,所以:

        coms

      【讨论】:

        猜你喜欢
        • 2018-11-27
        • 1970-01-01
        • 2014-12-03
        • 2019-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-30
        • 1970-01-01
        相关资源
        最近更新 更多