想象一下,我有一个名为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"....]
答案 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))