R简单易用的方式将其写入一行?

时间:2015-07-24 19:06:53

标签: r vectorization

想象一下,我有一个名为PAD的数据帧。 我想添加新列。 我需要写这么多行,(他们做行计算)。

 PAD[,"MV1"] <- rowMeans(PAD[,1:3], na.rm=TRUE)
 PAD[,"MV2"] <- rowMeans(PAD[,4:6], na.rm=TRUE)
 PAD[,"MV3"] <- rowMeans(PAD[,7:9], na.rm=TRUE)
 PAD[,"MV4"] <- rowMeans(PAD[,10:12], na.rm=TRUE)
 PAD[,"MV5"] <- rowMeans(PAD[,13:15], na.rm=TRUE)
 PAD[,"MV6"] <- rowMeans(PAD[,16:18], na.rm=TRUE)
 PAD[,"MV7"] <- rowMeans(PAD[,19:21], na.rm=TRUE)
 PAD[,"MV8"] <- rowMeans(PAD[,22:24], na.rm=TRUE)

或具有我自己功能的东西

 PAD[,"VV1"] <- apply(PAD[,1:3], 1, function(x) min(x), na.rm=TRUE))
 PAD[,"VV2"] <- apply(PAD[,4:6], 1, function(x) min(x), na.rm=TRUE))
 PAD[,"VV3"] <- apply(PAD[,7:9], 1, function(x) min(x), na.rm=TRUE))
 PAD[,"VV4"] <- apply(PAD[,10:12], 1, function(x) min(x), na.rm=TRUE))
 PAD[,"VV5"] <- apply(PAD[,13:15], 1, function(x) min(x), na.rm=TRUE))
 PAD[,"VV6"] <- apply(PAD[,16:18], 1, function(x) min(x), na.rm=TRUE))
 PAD[,"VV7"] <- apply(PAD[,19:21], 1, function(x) min(x), na.rm=TRUE))
 PAD[,"VV8"] <- apply(PAD[,22:24], 1, function(x) min(x), na.rm=TRUE))

我知道有一些方法可以将它们全部写在一行(或两个:))。 像for循环但是避开循环,也许我们可以称之为矢量化版本。

我该怎么办? 也许在assignement的两边以paste0(.....)开头的东西? ,或者可能创建一个函数并传递一个向量,但我有点困惑。我不知道是否必须使用parse()或eval()或只生成序列。

正如你所看到的,我将把每个N1(这里是3个)列计算并分配给N2个新列(这里是8个)。

另一个问题, 分配给它更好吗?

 c(PAD[,"VV1"], PAD[,"VV2"], PAD[,"VV3"], ...)

或者?

 PAD[,"VV1","VV2","VV3"....]

2 个答案:

答案 0 :(得分:2)

for (i in 1:8) {
  varname = paste('MV',i,sep='')
  PAD[,varname] <- rowMeans(PAD[, (3*n-2):(3*n)], na.rm=TRUE)
}

是的,你可以使用* apply做双线,虽然它不太清晰。

答案 1 :(得分:1)

这是两行:

cols <- split(1:24, rep(1:8, each = 3))
for (i in 1:8) PAD[[paste0("MV", i)]] <- rowMeans(PAD[, cols[[i]]], na.rm = TRUE)

修改

如果您想避免使用for循环,可以执行此操作。

cols <- split(1:24, rep(1:8, each = 3))
tmp <- lapply(1:8, function(x) rowMeans(PAD[, cols[[x]]], na.rm = TRUE))
names(tmp) <- paste0("MV", 1:8)
PAD <- cbind(PAD, do.call(cbind, tmp))