Performance R for循环创建一个类变量需要花费很长时间
我的问题包括两部分。我有一个带有ID的矩阵和几列(表示时间)的值,从0到180。我想用子组来总结这些,然后跨列进行比较。例如,有多少ID从第5列中的0-10切换到第6列中的11+ 现在,我的第一个想法是SAS风格的格式化命令。这可以让我将整数分组到不同的块中(0-10、11-20、21-30等)。但是,这似乎并不存在 我的解决方案是循环该矩阵的所有值(对于循环为双值),并检查这些值是否在特定范围内(if语句的字符串),然后将该值输入一个只跟踪类的新矩阵。例如:Performance R for循环创建一个类变量需要花费很长时间,performance,r,if-statement,for-loop,Performance,R,If Statement,For Loop,我的问题包括两部分。我有一个带有ID的矩阵和几列(表示时间)的值,从0到180。我想用子组来总结这些,然后跨列进行比较。例如,有多少ID从第5列中的0-10切换到第6列中的11+ 现在,我的第一个想法是SAS风格的格式化命令。这可以让我将整数分组到不同的块中(0-10、11-20、21-30等)。但是,这似乎并不存在 我的解决方案是循环该矩阵的所有值(对于循环为双值),并检查这些值是否在特定范围内(if语句的字符串),然后将该值输入一个只跟踪类的新矩阵。例如: # search through
# search through columns
for (j in 2:(dim(Tab2)[2])){
# search through lines
for (i in 1:dim(Tab2)[1]){
if (is.na(Tab2[i,j])){
tempGliss[i,j] <- "NA"}
else if (Tab2[i,j]==0){
tempGliss[i,j] <- "Zero"}
else if (Tab2[i,j]>0 & Tab2[i,j]<=7){
tempGliss[i,j] <- "1-7"}
else if (Tab2[i,j]>=7 & Tab2[i,j]<=14){
tempGliss[i,j] <- "7-14"}
else if (Tab2[i,j]>=15 & Tab2[i,j]<=30){
tempGliss[i,j] <- "15-30"}
else if (Tab2[i,j]>=31 & Tab2[i,j]<=60){
tempGliss[i,j] <- "31-60"}
else if (Tab2[i,j]>=61 & Tab2[i,j]<=90){
tempGliss[i,j] <- "61-90"}
else if (Tab2[i,j]>=91 & Tab2[i,j]<=120){
tempGliss[i,j] <- "91-120"}
else if (Tab2[i,j]>=121 & Tab2[i,j]<=150){
tempGliss[i,j] <- "121-150"}
else if (Tab2[i,j]>=151 & Tab2[i,j]<=180){
tempGliss[i,j] <- "151-180"}
else if (Tab2[i,j]>180){
tempGliss[i,j] <- ">180"}
}
}
#在列中搜索
对于(j-in-2:(dim(Tab2)[2]){
#逐行搜索
对于(i in 1:dim(Tab2)[1]){
if(is.na(表2[i,j])){
tempGliss[i,j]也许你可以使用cut
Tab2 <- data.frame(a = 1:9, b = c(0, 7, 14, 30, 60, 90, 120, 150, 155)
,c = c(0, 1, 7, 15, 31, 61, 91, 121, 155))
repla <- c("Zero", "1-7", "7-14", "15-30", "31-60", "61-90", "91-120", "121-150", "151-180", ">180")
for(j in 2:(dim(Tab2)[2])){
dum <- cut(Tab2[,j], c(-Inf,0,7,14,30,60,90,120,150,180, Inf))
levels(dum) <- repla
Tab2[,j] <- dum
}
> Tab2
a b c
1 1 Zero Zero
2 2 1-7 1-7
3 3 7-14 1-7
4 4 15-30 15-30
5 5 31-60 31-60
6 6 61-90 61-90
7 7 91-120 91-120
8 8 121-150 121-150
9 9 151-180 151-180
Tab2您可能想在library(car)
中试用recode
函数,它可以让您轻松地将这些输入值范围转换为分类输出。由于您要对每个变量应用一些编码,因此使用apply(Tab2,2,recode,…)相对容易一些
重新编码所有变量。这会更快!而且它会跳过丢失的值“NA”,这正是我想要的。非常感谢