如何在数据框中对顺序标记的变量应用简单函数?

时间:2014-03-17 16:49:34

标签: r function grep dataframe

我试图在顺序标记的许多变量上应用一系列简单函数,并将这些新创建的变量绑定到同一数据框。我设法做了第一部分(很大程度上是在前一个答案的帮助下)而不是第二部分。

dat <- data.frame(x1=sample(c(0:1)), av1 = sample(10) , av2 = sample(10) , av3 = sample(10),av4=sample(10))
dat$t1<-ifelse(dat$x1==1,dat$av1*2/7,dat$av1*5/7)
dat$t2<-ifelse(dat$x1==1,dat$av2*2/7,dat$av2*5/7)
dat$t3<-ifelse(dat$x1==1,dat$av3*2/7,dat$av3*5/7)
dat$t4<-ifelse(dat$x1==1,dat$av4*2/7,dat$av4*5/7)
dat

基本上,我想对av1,av2,av3 ..的所有值重复这些ifelse语句,以创建标记为tu1,tu2,tu3的相应变量,每次都不需要重新键入函数。例如:

dat <- cbind(dat,  sapply(dat[grep("av", names(dat))], function(col) { ifelse(dat$x1==0, col*2/7, col*5/7) } ) )

但是,现在所有新变量也标记为av。我想我之后可以更改列的名称,例如:

names( dat)[10:13] <- gsub("av", "tu", names(dat)[10:13])

因为我在代码中预先添加/删除变量,所以这些列号会不断变化。有没有办法让我同时创建,附加和重新标记新变量?或者是否有更好的方法在顺序标记的变量上应用相同的函数?

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

out <- ifelse(matrix(dat$x1,nrow(dat),sum(grepl("av",colnames(dat)))) == 1,
              as.matrix(dat[,grepl("av",colnames(dat))]) * 2 / 7,
              as.matrix(dat[,grepl("av",colnames(dat))]) * 5 / 7)

colnames(out) <- paste0("tu",seq_len(ncol(out)))

这比它需要的更紧凑,因为我一次完成所有强制。提取您需要的dat部分可能更清楚,并分别创建指标矩阵。

另一种选择是melt您的数据框并按组操作,然后将其重新格式化为宽格式。