【问题标题】:Changing values in a data.frame based upon another data.frame根据另一个 data.frame 更改 data.frame 中的值
【发布时间】:2017-02-02 04:25:40
【问题描述】:

以下是我正在尝试完成的假设示例:

   a  b         A  B
1  3  5      1  2  4
2  7  9      2  6  8

我有两个大小相同的data.frames。根据第一个data.frame中的每个值,我想更新第二帧中的对应值。如果我要使用带有假设条件的 C 风格 for 循环来编写它,它看起来像这样:

for (i = 0; i < numRol; i++) {
    for (j = 0; j < numCol; j++) {
        if (frame1[i][j] < frame2[i][j])
            frame2[i][j] += 1
        else
            frame2[i][j] -= 1
    }
}

所以在本例中,第二个data.frame 将被转换为:

   A  B
1  1  3
2  5  7

在这种 R 的情况下,我认为我不需要使用 for 循环,而是可以使用 apply 系列的一些变体。

对于我的具体情况,如果我在 frame1 中找到 0,我想将 1 放在 frame2 中的相同位置。在这种情况下,我可能需要使用嵌套应用,但我不太确定如何编写通用的可重现示例。

【问题讨论】:

    标签: r apply


    【解决方案1】:

    如果您的 data.frames 存储为df1df2,例如:

     df1 = data.frame(a=c(3,7), b=c(5,9))
     df2 = data.frame(a=c(2,6), b=c(4,8))
    

    然后你可以比较整个结构。因此,您可以通过以下方式完成您的要求:

    df2[df1 == 0] <- 1
    df2[df1 < df2] = df2[df1 < df2] + 1
    df2[df1 > df2] = df2[df1 > df2] - 1
    

    取决于你想如何处理零情况

    【讨论】:

    • 注意:如果您打算在变异时根据原始值进行多重比较,则需要使用临时变量而不是覆盖。
    • 例如,当您执行 df2[df1
    • 每个值都与括号内其他 data.frame 中相同位置的值进行比较。例如,如果您隔离 df1
    • 感谢您的帮助。不知道您可以以这种方式使用 [] 运算符。
    【解决方案2】:

    要根据 df1

    df2 + ((2 * (df1 < df2)) - 1)
      A B
    1 1 3
    2 5 7
    

    这里

    ((2 * (df1 < df2)) - 1)
    

    返回

          a  b
    [1,] -1 -1
    [2,] -1 -1
    

    相反的比较返回

    ((2 * (df1 > df2)) - 1)
         a b
    [1,] 1 1
    [2,] 1 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      相关资源
      最近更新 更多