如何申请上依次标注变量简单函数在数据帧?(How to apply simple functions

2019-10-19 14:56发布

我想申请上依次标有许多变数一系列简单的功能并结合这些新创建的变量相同的数据帧。 我设法做的第一部分(主要是与以前的答案的帮助下),而不是第二部分。

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

因为我一直在我的代码预先添加/删除变量的列数不断变化。 有没有办法为我创造,重视并同时重新标记新的变数? 或者是有过申请顺序标记的变量相同功能的更好的办法?

Answer 1:

你可以尝试这样的事:

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你的数据帧,并通过组对它进行操作,然后将其重铸宽格式。



文章来源: How to apply simple functions on sequentially labelled variables in a data frame?