考虑以下示例:
Var_A <- sample(1:100,5,replace=TRUE)
Var_B <- sample(1:100,5,replace=TRUE)
Var_C <- sample(1:100,5,replace=TRUE)
Var_D <- sample(1:100,5,replace=TRUE)
DF <- as.data.frame(cbind(Var_A,Var_B,Var_C,Var_D))
在R中,函数已经存在以找到以元素为单位的max和min,因此我可以轻松地创建一个新变量,该变量等于感兴趣列中的最大(或最小)值:
> DF$Max <- pmax(Var_A,Var_B,Var_C,Var_D)
> DF
Var_A Var_B Var_C Var_D Max
1 44 33 6 72 72
2 29 66 51 12 66
3 35 29 47 79 79
4 39 79 47 65 79
5 97 60 36 81 97
但是如果我需要创建一个变量来捕获比如每行中的第二大值(即跨列)?
在我正在使用的真实数据集中,我有600多列和大约2800万条记录。我需要创建变量来识别和存储在查看每条记录的变量(列)时找到的最大,第二大,第三大等值,就像pmax
那样,但对于其他序数。
我能够在功能上使其在数据的子集上工作的唯一方法是进行循环,但是如果我在整个数据集上运行它,那么该循环在我的生命周期中不会完成。我还考虑过使用apply
函数,但我的理解是apply
会首先将数据集转换为矩阵,我的数据集不会对此感兴趣。
有关非循环方式的任何建议吗?有了这么多的数据,越快越好......
答案 0 :(得分:1)
这可能是一个解决方案......
Var_A <- sample(1:100,5,replace=TRUE)
Var_B <- sample(1:100,5,replace=TRUE)
Var_C <- sample(1:100,5,replace=TRUE)
Var_D <- sample(1:100,5,replace=TRUE)
DF <- as.data.frame(cbind(Var_A,Var_B,Var_C,Var_D))
result <-sapply(1:nrow(DF), function(x) {
df <- as.data.frame(DF[x,])
ord <- df[order(-DF[x,])]
})
result <- t(result)
output <- cbind(DF,result)
for (i in (ncol(DF)+1):ncol(output) ) {
colnames(output)[i]<-paste0("Max",i-ncol(DF))
}
output
Var_A Var_B Var_C Var_D Max1 Max2 Max3 Max4
1 42 12 64 9 64 42 12 9
2 67 22 47 4 67 47 22 4
3 80 56 82 94 94 82 80 56
4 31 62 88 73 88 73 62 31
5 91 67 15 41 91 67 41 15