我的数据框看起来像这样:
X <- structure(list(PRCP12 = c(0L, 0L, 0L, 0L, 0L, 0L, 61L, 0L, 0L,
8L), PRCP13 = c(0L, 0L, 480L, 0L, 0L, 0L, 310L, 30L, 0L, 0L),
PRCP14 = c(0L, 0L, 61L, 150L, 0L, 0L, 99L, 0L, 0L, 0L), PRCP15 = c(0L,
0L, 0L, 33L, 0L, 0L, 3L, 0L, 0L, 0L), PRCP16 = c(0L, 3L,
0L, 0L, 0L, 3L, 5L, 0L, 3L, 0L), PRCP17 = c(0L, 0L, 0L, 3L,
0L, 3L, 0L, 0L, 0L, 0L), PRCP18 = c(0L, 0L, 0L, 3L, 0L, 0L,
8L, 0L, 0L, 0L), PRCP19 = c(0L, 0L, 0L, 71L, 0L, 0L, 231L,
0L, 0L, 0L)), .Names = c("PRCP12", "PRCP13", "PRCP14", "PRCP15",
"PRCP16", "PRCP17", "PRCP18", "PRCP19"), row.names = c(NA, 10L
), class = "data.frame")
真实数据有更多的列和行。
对于每个PRCP,我想创建一个新的0 1变量。
现在我正在定义一个运行循环的函数。
rainyday <- function(vname, X){
vname2 = paste('R', vname, sep="")
vname3 = paste('PRCP', vname, sep="")
X[vname2] = 0
X[vname2][X[vname3]>0.254] = 1
return(X)
}
for (i in 12:19 ) {
X = rainyday(i, X)
}
有更好的方法吗?
谢谢!
答案 0 :(得分:0)
你想要这样的东西:
X <- sapply(df[12:19],rainyday)
如果这不起作用,你可以查看apply lapply(list) vapply(vector)
您还可以在sapply
X <- sapply(X[12:19],function(i){
vname2 = paste('R', i, sep="")
vname3 = paste('PRCP', i, sep="")
X[vname2] = 0
X[vname2][X[vname3]>0.254] = 1
return(X)
})
由于我没有R可供测试,我希望没有错别字或错误,但它们应该有效。
答案 1 :(得分:0)
@Christian Borck + @Richard Scriven的答案非常适合我想做的事。
X2 <- cbind(X, (X > 0.254) * 1)
names(X2) <- c(names(X), paste0("R", gsub("[^0-9]", "", names(X))))
谢谢!