我在R中有一个名为data
的数据集,在这个数据集中我有600多个变量。在这些变量中,我有94个变量称为data$sleep1,data$sleep2...data$sleep94
,另有94个变量称为data$wakeup1,data$wakeup2...data$wakeup94
。
我想创建新变量data$total1-data$total94
,每个变量都是同一天sleep
和wakeup
的总和。
例如,data$total64 <-data$sleep64 + data$wakeup64
,data$total94<-data$sleep94+data$wakeup94
。
没有循环,我需要编写94次此代码。我希望有人可以给我一些提示。它不一定是一个循环,但更容易做到这一点。
仅供参考,每个变量都是数字变量,缺失值约为30%。失踪是随机的,它可能在任何地方。缺失值是空白但不是0.
答案 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
,我们可以replace
将NA
值设为0,然后像以前一样将它们一起添加。
data[nm1] <- replace(sleepDat, is.na(sleepDat), 0) +
replace(wakeDat, is.na(wakeDat), 0)
如果缺失值为''
,则列可以是factor
或character
类(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
。