我希望让我的代码更高效。我有一个调查,其中我的数据看起来像:
survey <- data.frame(
x = c(1, 6, 2, 60, 75, 40, 27, 10),
y = c(100, 340, 670, 700, 450, 200, 136, 145))
#Two lists:
A <- c(3, 6, 7, 27, 40, 41)
t <- c(0.10, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16)
我所做的是创建新列,如下所示:
z <- ifelse(survey$x %in% A), 0, min(t))
for (i in t) {
survey[paste0("T",i)] <-z
survey[paste0("T",i)] <-ifelse (z > 0, i, z)
}
但是用那段代码需要花费一些时间,有没有更好的方法来实现呢?
survey[paste0("T", t)] <- lapply(t, function(y) ifelse(survey$x %in% A, 0, y))
这段代码。它的作用是将survey$x
中属于集合A
的元素设为0,并分别赋值给survey
数据框中列名称为T
后跟当前t
值的列。 - akrundata.table
,它可能会更快,即setDT(survey)[, paste0("T", t) := 0]; for(j in t) {set(survey, i = which(!survey$x %in% A), j = paste0("T", j), value = j)}
。 - akrun