簡體   English   中英

使用R中的其他列值來選擇data.table分配的LHS列和RHS列

[英]Picking LHS column and RHS column of data.table assignment using other column values in R

這是產生樣本數據集的代碼:

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)
}

如果您願意使用tidyverse和tibble數據幀,我會這樣做。

require(tibble)
testdata <- as_tibble(testdata)

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

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

否則,如果您肯定要使用data.tables,那么我會同意akrun的建議,盡管您需要將Y3列的數據類型更改為兩倍,或者在運行該代碼時不存在它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM