我试图在顺序标记的许多变量上应用一系列简单函数,并将这些新创建的变量绑定到同一数据框。我设法做了第一部分(很大程度上是在前一个答案的帮助下)而不是第二部分。
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])
因为我在代码中预先添加/删除变量,所以这些列号会不断变化。有没有办法让我同时创建,附加和重新标记新变量?或者是否有更好的方法在顺序标记的变量上应用相同的函数?
答案 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
您的数据框并按组操作,然后将其重新格式化为宽格式。