【问题标题】:R: How to do fastest replacement in R?R:如何在 R 中进行最快的替换?
【发布时间】:2011-09-26 11:49:38
【问题描述】:

我有一个这样的输入数据框(真实的非常大,所以我想做得更快):

df1 <- data.frame(A=c(1:5), B=c(5:9), C=c(9:13))

  A B  C
1 1 5  9
2 2 6 10
3 3 7 11
4 4 8 12
5 5 9 13

我有一个带有这样替换代码的数据框(这里的条目可能超过 df1):

df2 <- data.frame(X=c(1:15), Y=c(101:115))

    X   Y
1   1 101
2   2 102
3   3 103
4   4 104
5   5 105
6   6 106
7   7 107
8   8 108
9   9 109
10 10 110
11 11 111
12 12 112
13 13 113
14 14 114
15 15 115

通过将 df2$X 与 df1$A 和 df1$B 中的值匹配,我想通过将 df1$A 和 df1$B 替换为 df2$Y 中的相应值来获得一个 new_df1,即得到这个 new_df1

  A    B    C
1 101  105  9
2 102  106 10
3 103  107 11
4 104  108 12
5 105  109 13

由于我的数据框非常大,您能否给我一些指导如何在 R 中更快地做到这一点?非常感谢。

【问题讨论】:

  • 很难提出一种更快 的方法来执行此操作,除非我们知道您已经尝试过这样做并且发现它太慢了。另外,我们可以假设 df2$X 中的值总是按照您的示例中的顺序排列吗?

标签: r replace dataframe


【解决方案1】:

正如 Thilo 提到的,Nico 的回答假定 df2 是按 X 排序的,X 包含每个整数 1,2,3....。

我更喜欢使用match() 作为更一般的情况:

df1 <- data.frame(A=c(1:5), B=c(5:9), C=c(9:13))
df2 <- data.frame(X=c(1:15), Y=c(101:115))

new_df1 <- df1

new_df1$A <- df2$Y[match(df1$A,df2$X)]
new_df1$B <- df2$Y[match(df1$B,df2$X)]
    A   B  C
1 101 105  9
2 102 106 10
3 103 107 11
4 104 108 12
5 105 109 13

【讨论】:

    【解决方案2】:

    超级简单!您只需要在数组中获取正确的偏移量。

    例如,要获取df2 的 Y 列对应于 df1 的 A 列中的值,您将编写 df2$Y[df1$A]

    因此,您的代码将是:

    df_new <- data.frame("A" = df2$Y[df1$A], "B" = df2$Y[df1$B], "C" = df1$C)
    

    【讨论】:

    • 但是,请注意,此方法假定 df2 按 X 排序,并且 X 必须等于每一行的行数。您可以通过输入all(df2$X == 1:nrows(df2)) 来验证这一点。如果不是这样,您应该查看match-function。
    • @Thilo:从他提供的示例数据来看,我认为是这样,但你提出了一个很好的观点。另外,which 可能有用。
    • @nico:我可能会给出与您相同的答案。我的评论部分是为了指导任何进一步使用您的解决方案而不考虑先决条件的读者。
    【解决方案3】:

    这是另一种(单行)方式。

    > with(c(df2,df1),data.frame(A = Y[match(A,X)],B = Y[match(B,X)],C))
        A   B  C
    1 101 105  9
    2 102 106 10
    3 103 107 11
    4 104 108 12
    5 105 109 13
    

    但是我不确定它是否会比其他建议更快

    【讨论】:

      猜你喜欢
      • 2014-12-25
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      • 2021-07-08
      • 2019-05-12
      相关资源
      最近更新 更多