在给定条件的情况下为数据帧的元素创建新变量

时间:2014-05-01 13:55:46

标签: r

我的数据框看起来像这样:

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

有更好的方法吗?

谢谢!

2 个答案:

答案 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))))

谢谢!