我有一個數據集,看起來如何在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))
而且看起來
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)
}
此功能的目標是看到在兩種site1
和site2
哪些變量和函數,如果有一個「NA 「中,可以說site1$A
,將其替換爲site2$A
中的相應值。在site2
之上有一個site1
的層次結構,這就是爲什麼ifelse
語句只檢查一個帶有「NA」的變量。
由於第一個ifelse
結果(get("i.",names(x))
)在條件不正常工作後出現lapply
函數錯誤。這樣做,我得到以下錯誤:
Error in as.environment(pos) : using 'as.environment(NULL)' is defunct
我不明白。理想情況下,我會得到的是在site1
所有值的data.table
和site2
與變量A
,B
,C
,D
而不是與i.A
,i.B
因爲如此,
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
所以,我想我真的有兩個問題。第一個是錯誤,第二個是我沒有在我的函數中獲得k
中的所有行。他們似乎沒有關係。
任何幫助表示讚賞。
另外,布朗尼積分誰可以弄清楚不可思議col.smash
參考。
你能做到這一點作爲骨料操作由'='羣體,如果你做一個長data.table通過rbind-ING 'site1'和'site2'在彼此之下。 – thelatemail
只是爲了澄清,你在談論完整的專欄,對吧?措辭_如果有一個「NA」,可以說'site1 $ A',將其替換爲'site2 $ A'_中的相應值,這有點不幸,因爲它表明您正在要求__ row-wise replacement_。但是在這種情況下,預期結果將在列「B」的第3行中顯示「C」,例如, – Uwe
@UweBlock我不理解你的問題。請澄清 – akash87