【问题标题】:How to apply simple functions on sequentially labelled variables in a data frame?如何对数据框中按顺序标记的变量应用简单函数?
【发布时间】:2014-03-17 16:49:34
【问题描述】:

我正在尝试对许多按顺序标记的变量应用一系列简单的函数,并将这些新创建的变量绑定到同一个数据框。我设法完成了第一部分(主要是在先前答案的帮助下),但没有完成第二部分。

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

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

【问题讨论】:

  • 您可以在执行sapply 后立即使用duplicated(colnames(dat)) 使用gsub 重命名这些列,而不是列出列号

标签: r function dataframe


【解决方案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您的数据框并按组对其进行操作,然后将其重新转换为宽格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2018-01-14
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    相关资源
    最近更新 更多