【问题标题】:Picking LHS column and RHS column of data.table assignment using other column values in R使用 R 中的其他列值选择 data.table 分配的 LHS 列和 RHS 列
【发布时间】:2017-07-25 09:38:40
【问题描述】:

这是生成示例数据集的代码:

require(data.table)
testdata <- data.table(
  X = rep(sample(1:3),5),
  Y = rep(sample(1:3),5),
  X1 = rnorm(15),
  X2 = rnorm(15),
  X3 = rnorm(15),
  Y1 = NA_character_,
  Y2 = NA_character_,
  Y3 = NA_character_
)

初始数据表:

    X Y         X1          X2          X3 Y1 Y2 Y3
 1: 3 3 -0.7098927  0.63342935  0.94470612 NA NA NA
 2: 1 2  0.3008547 -1.40043977  1.53781754 NA NA NA
 3: 2 1  0.3423140  0.34897695 -0.38402565 NA NA NA
 4: 3 3 -0.5726456 -2.24526957 -1.10947867 NA NA NA
 5: 1 2 -1.3239474 -0.53924617 -0.04103982 NA NA NA
 6: 2 1  0.2493801  0.85806647  0.96488021 NA NA NA
 7: 3 3 -2.0653505  0.05481703  1.75161043 NA NA NA
 8: 1 2 -1.3919774  0.34282832  0.50834289 NA NA NA
 9: 2 1  0.5928025 -1.11899399  0.35967102 NA NA NA
10: 3 3 -0.4704720  0.64004313 -0.17343794 NA NA NA
11: 1 2  0.3056093  2.14544631  0.43740447 NA NA NA
12: 2 1 -0.1568971  1.05091249  1.18884487 NA NA NA
13: 3 3 -1.3078670  1.07482123 -0.65367957 NA NA NA
14: 1 2  0.4622123 -0.60308532 -1.11104235 NA NA NA
15: 2 1 -0.7894978  0.33018926 -0.04700393 NA NA NA

这是我要执行的操作: 在每一行中,

if X = 2 and Y = 3 then Y3 <- X2

预期输出:

    X Y         X1          X2          X3 Y1                 Y2                 Y3
 1: 3 3 -0.7098927  0.63342935  0.94470612 NA                 NA                 0.94470612
 2: 1 2  0.3008547 -1.40043977  1.53781754 NA                 0.3008547          NA
 3: 2 1  0.3423140  0.34897695 -0.38402565 0.34897695         NA                 NA
 4: 3 3 -0.5726456 -2.24526957 -1.10947867 NA                 NA                 -1.10947867
 5: 1 2 -1.3239474 -0.53924617 -0.04103982 NA                 -1.3239474         NA
 6: 2 1  0.2493801  0.85806647  0.96488021 0.85806647         NA                 NA
 7: 3 3 -2.0653505  0.05481703  1.75161043 NA                 NA                 1.75161043
 8: 1 2 -1.3919774  0.34282832  0.50834289 NA                 -1.3919774         NA
 9: 2 1  0.5928025 -1.11899399  0.35967102 -1.11899399        NA                 NA
10: 3 3 -0.4704720  0.64004313 -0.17343794 NA                 NA                 -0.17343794
11: 1 2  0.3056093  2.14544631  0.43740447 NA                 0.3056093          NA
12: 2 1 -0.1568971  1.05091249  1.18884487 1.05091249         NA                 NA
13: 3 3 -1.3078670  1.07482123 -0.65367957 NA                 NA                 -0.65367957
14: 1 2  0.4622123 -0.60308532 -1.11104235 NA                 0.4622123          NA
15: 2 1 -0.7894978  0.33018926 -0.04700393 0.33018926         NA                 NA

如何使用简单的 data.table 语法来实现这一点?我尝试过 get、eval(parse) 等,但每次都遇到麻烦。

请注意,我的实际数据集非常大(100 多列),因此我需要一个不依赖于列号的解决方案。我也可以编写大量的 if 语句,但对于需要以类似方式分配的大约 30 个奇数列来说,这样做似乎不太好。

data.table 版本是 1.10.4,R 版本是 3.3.2

编辑:我使用函数解决了它。不确定这是否是最好的方法,因为它非常非常慢。

populateY <- function(input_table) {

  for(i in 1:nrow(input_table)) {
    k <- X
    j <- Y
    tempX <- paste0("input_table$X",k,"[i]")
    tempY <- paste0("input_table$Y",j,"[i]")
    eval(parse(text = paste0(tempY," <- ",tempX)))
  }    
  return(input_table)
}

【问题讨论】:

  • 试试testdata[X==2 &amp; Y==3, Y3 := X2][]
  • 有几个排列和更多变量让我以这种方式布置所有组合。即使在这个简单的例子中,也可以有 9 行这样的代码。所以如果可能的话,我想要一个更简洁的解决方案@akrun
  • @Geep 您应该明确说明解决方案中所需的一切。我建议编辑您的原始帖子
  • @ChiPak ... 增加了示例数据集和预期输出的清晰度。

标签: r


【解决方案1】:

如果您愿意使用 tidyverse 和 tibble 数据框,我会这样做。

require(tibble)
testdata <- as_tibble(testdata)

testdata <- testdata %>%
  mutate(Y3 = ifelse(X == 2 & Y == 3, X2, NA))

然后,您可以在 mutate 函数中轻松清晰地添加所需的所有行。

否则,如果您肯定要使用 data.tables,那么我会接受 akrun 的建议,尽管您需要将 Y3 列的数据类型更改为双精度,或者只是在运行时不存在它那个代码。

【讨论】:

  • 感谢您的回答.. 我希望找到一种方法来使用存储在 X 和 Y 列中的值以编程方式执行此操作,而不是编写几个 if 语句,因为我必须根据更新 30 多个变量X/Y 列各有 5 种不同的可能性
  • 如果你想创建的变量有一些结构,你可以通过编程来完成,然后你可以循环或应用来生成这些。但是如果没有可遵循的模式,很难在摘要中告诉您如何以“创建它们”以外的任何方式生成 30 多个变量。
  • 好的.. 我确实有一个类似于示例中的 X1,X2,X3 和 Y1,Y2,Y3 结构的变量结构。 X 和 Y 列中保存的值也对应于该结构。我最终编写了一个可能是也可能不是最好的方法的函数..我将把它添加到问题中..
  • 我会再给它一点时间看看是否有任何其他解决方案出现。您和 akrun 提出的解决方案确实有效,我会将其标记为答案,如果没有更好的方法...我写的功能运行非常缓慢...谢谢
猜你喜欢
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 2016-03-30
  • 2016-11-07
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多