如何编写用于在R中创建多个变量的循环

时间:2016-02-26 18:53:21

标签: r

我在R中有一个名为data的数据集,在这个数据集中我有600多个变量。在这些变量中,我有94个变量称为data$sleep1,data$sleep2...data$sleep94,另有94个变量称为data$wakeup1,data$wakeup2...data$wakeup94

我想创建新变量data$total1-data$total94,每个变量都是同一天sleepwakeup的总和。

例如,data$total64 <-data$sleep64 + data$wakeup64data$total94<-data$sleep94+data$wakeup94

没有循环,我需要编写94次此代码。我希望有人可以给我一些提示。它不一定是一个循环,但更容易做到这一点。

仅供参考,每个变量都是数字变量,缺失值约为30%。失踪是随机的,它可能在任何地方。缺失值是空白但不是0.

2 个答案:

答案 0 :(得分:3)

我建议以长篇形式存储您的数据。为此,请使用melt。我将使用data.table

示例数据:

library(data.table)
set.seed(102943)
x <- setnames(as.data.table(matrix(runif(1880), nrow = 10)),
              paste0(c("sleep", "wakeup"), rep(1:94, 2)))[ , id := 1:.N]

熔体:

long_data <- 
  melt(x, id.vars = "id", 
       measure.vars = list(paste0("sleep", 1:94),
                           paste0("wakeup", 1:94)))

#rename the output to look more familiar
#**note: this syntax only works in the development version;
#        to install, follow instructions
#        here: https://github.com/jtilly/install_github
#        to install from https://github.com/Rdatatable/data.table
#        (or, read ?setnames and figure out how to make the old version work)
setnames(long_data, -1L, c("day", "sleep", "wakeup"))

我希望你会发现使用这种形式的数据要容易得多。

例如,您的问题现在很简单:

long_data[ , total := sleep + wakeup]

答案 1 :(得分:1)

我们可以在没有循环的情况下做到这一点。假设列按照上面提到的顺序排列,我们将“睡眠”列为子集。列和唤醒&#39;使用grep单独列,然后将数据集添加到一起。

sleepDat <- data[grep('sleep', names(data))]
wakeDat <- data[grep('wakeup', names(data))]
nm1 <- paste0('total', 1:94)
data[nm1] <- sleepDat+wakeDat

如果缺少值并且它们是NA,我们可以replaceNA值设为0,然后像以前一样将它们一起添加。

data[nm1] <- replace(sleepDat, is.na(sleepDat), 0) +
              replace(wakeDat, is.na(wakeDat), 0)

如果缺失值为'',则列可以是factorcharacter类(OP的帖子中不清楚)。在这种情况下,我们可能需要将数据集转换为numeric类,以便''自动转换为NA

 sleepDat[] <- lapply(sleepDat, function(x) 
                      as.numeric(as.character(x)))
 wakeDat[] <- lapply(wakeDat, function(x) 
                     as.numeric(as.character(x)))

然后像以前一样继续。

注意:如果列为character,请忽略as.character步骤,仅使用as.numeric