【问题标题】:Create a new column from different columns of one data frame conditioned on another column from another data frame从一个数据框的不同列创建一个新列,以另一个数据框的另一列为条件
【发布时间】:2017-08-29 10:48:05
【问题描述】:

假设我有两个数据框

df1 <- data.frame(A = 1:6, B = 7:12, C = rep(1:2, 3))
df2 <- data.frame(C = 1:2, D = c("A", "B"))

我想在 df1 中创建一个新的 E 列,其值基于 C 列的值,然后可以将其连接到 df2 中的 D 列。例如,df1 第一行的 C 值为“1”。而df2中C列的值1对应D列的“A”,所以df2中创建的值E应该来自“A”列,即1。

按照Select values from different columns based on a variable containing column names的建议,我可以通过两步来实现:

setDT(df1)
setDT(df2)
df3 <- df1[df2, on = "C"] # step 1 combines the two data.tables
df3[, E := .SD[[.BY[[1]]]], by = D] # step 2

我的问题是:我们可以一步完成吗?此外,由于我的数据比较大,这个原始解决方案的第一步需要很多时间。我们能以更快的方式做到这一点吗? 有什么建议么?

【问题讨论】:

  • 如果被标记为重复,则表示答案在另一个问题中;)
  • 抱歉造成混淆,更新后的问题与原来的问题不同
  • df2 在你的真实数据中有多少行?
  • 我在 df1 中有 31308885 行,在 df2 中有 4 行
  • 查看我的回答here,看看它是否有效。不要合并,而是创建一个命名向量。

标签: r data.table


【解决方案1】:

我会这样做:

df1[df2, on=.(C), D := i.D][, E := .SD[[.BY$D]], by=D]

   A  B C D  E
1: 1  7 1 A  1
2: 2  8 2 B  8
3: 3  9 1 A  3
4: 4 10 2 B 10
5: 5 11 1 A  5
6: 6 12 2 B 12

这会通过引用将列添加到df1,而不是创建一个新表,所以我想这比构建df3 更有效。此外,由于它们已添加到 df1,因此这些行将保留其原始顺序。

【讨论】:

    【解决方案2】:

    你可以试试这个,C列可以表示来自df1的列值

    setDT(df1) df1[, e := eval(parse(text = names(df1)[C])), by = 1:nrow(df1)] df1

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

    【讨论】:

    • 请不要忘记添加一些文字来解释您的答案 - 为什么它有效以及它如何解决原始问题。
    猜你喜欢
    • 1970-01-01
    • 2018-02-13
    • 2021-08-06
    • 2022-10-14
    • 2019-08-12
    • 2019-03-19
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    相关资源
    最近更新 更多