私はdata.tableでlapplyを動的に使用する方法は?
set.seed(18)
library(data.table)
site1 <- data.table(id = 1:10, A = c(sample(c(NA, letters[1:10]),10)),
B = sample(c(NA, LETTERS[1:7]), 10, replace = T),
C = sample(c(NA, 1:4), 10, replace = T))
site2 <- data.table(id = c(1:4, sample(5:15, 6)),
A = c(NA, NA, NA, sample(letters, 1), NA, NA, NA, sample(letters, 1), NA, NA),
B = sample(LETTERS, 10), d = sample(1:5, replace = T))
とこの機能の目標は「NAがある場合、変数はsite1
とsite2
の両方にあり、ものを見るためにある
col.smash <- function(a, b, linkvars){
require(data.table)
##### CONVERT TO DATA.TABLES FOR EASIER USE, AND MERGE
if(dim(a)[1] <= dim(b)[1]){
c <- data.table(a); setkeyv(c, linkvars)
d <- data.table(b); setkeyv(d, linkvars)
} else {
c <- data.table(b); setkeyv(c, linkvars)
d <- data.table(a); setkeyv(d, linkvars)
}
k <- c[d]
rep.list<- names(a)[names(a) %in% names(b) & !(names(a) %in% linkvars)]
i.combo <- paste0("i.",rep.list)
f <- k[ , (rep.list) := lapply(.SD, function(x){ifelse(is.na(x),
get("i.", names(x)), x)}),
.SDcols = rep.list]
return(f)
}
ように見える関数として見えるデータセットを持っています「で、
site2$A
の対応する値で置き換え、
site1$A
を言うことができます。
ifelse
文が唯一の「NA」と一つの変数をチェックする理由です
site2
オーバー
site1
の階層は、あります。
条件が正常に動作していないされた後、私は、最初のifelse
結果(get("i.",names(x))
)のでlapply
機能でエラーを取得しています。この場合、次のエラーが発生します。
私はわかりません。理想的には、私はなるだろうことは、
id A B C d
1: 1 i E NA 4
2: 2 g F NA 4
3: 3 h NA 4 1
4: 4 x B 4 2
5: 5 j G NA NA
6: 6 c NA 3 4
7: 7 a D 2 NA
8: 8 b NA 2 NA
9: 9 d G 1 4
10: 10 f NA 1 NA
11: 12 NA V NA 2
12: 13 n J NA 1
13: 14 NA T NA 1
14: 15 NA X NA 1
だから、私は実際には2つの問題を抱えている変数A
、B
、C
、i.A
とD
はなく、のようなi.B
とsite1
とsite2
内のすべての値を持つdata.table
だと思います。最初は誤りであり、第二は、私は私の機能にk
内のすべての行を取得しておりませんということです。彼らは関連していないようです。
何か助けていただければ幸いです。
また、ブラウニーは、誰でも信じられないほどcol.smash
を参照できると指摘しています。
のようなものあなたはrbind-INGで一つの長いdata.tableを作る場合は、= 'グループによる'で集計操作としてこれを行うことができます'site1'と' site2'はお互いの下にあります。 – thelatemail
明確にするために、あなたは完全な列について話していますよね?言い換えれば、 "NA"がある場合、 'site1 $ A'は' site2 $ A'_の対応する値で置き換えます。これは、あなたが行を置換する_を求めていることを示唆しています。しかし、この場合、期待される結果は列「B」の行3に「C」を示す。 – Uwe
@UweBlock私はあなたの質問を理解していません。 – akash87