R 使用if语句高效地循环行和列

R 使用if语句高效地循环行和列,r,R,我有两个向量的列名。除单个数字外,每个向量都具有相同的长度和名称 columns <- paste0("q1h10_",1:9) # Filter columns columns2 <- paste0("q1h4_", 1:9) # Columns where number is at columns我认为以下代码适用于您的第一个条件(您可以轻松地将其适应于其他两个条件) 我认为下面的代码适用于您的第一个条件(您可以轻松地将其适应于其他两个条件) 我们可以通过以下方式更有效地执行您

我有两个向量的列名。除单个数字外,每个向量都具有相同的长度和名称

columns <- paste0("q1h10_",1:9) # Filter columns
columns2 <- paste0("q1h4_", 1:9) # Columns where number is at

columns我认为以下代码适用于您的第一个条件(您可以轻松地将其适应于其他两个条件)


我认为下面的代码适用于您的第一个条件(您可以轻松地将其适应于其他两个条件)


我们可以通过以下方式更有效地执行您的逻辑:

value <- as.character(rep(0,nrow(psid)))

cond1 <- 5 == psid[,columns]
cond2 <- matrix(as.matrix(psid[,columns2]) %in% (97:99), nrow(psid))
ind1 <- which(cond1 & !cond2, arr.ind=TRUE)
if (length(ind1) > 0) value[ind1[,1]] <- substr(columns[ind1[,2]],7,8)
ind2 <- which(cond1 & cond2, arr.ind=TRUE)
ind2 <- matrix(ind2[ind2[,2]!=1,],ncol=2)
if (length(ind2) > 0) value[ind2[,1]] <- substr(columns[ind2[,2]-1],7,8)

我们可以通过以下方式更有效地执行您的逻辑:

value <- as.character(rep(0,nrow(psid)))

cond1 <- 5 == psid[,columns]
cond2 <- matrix(as.matrix(psid[,columns2]) %in% (97:99), nrow(psid))
ind1 <- which(cond1 & !cond2, arr.ind=TRUE)
if (length(ind1) > 0) value[ind1[,1]] <- substr(columns[ind1[,2]],7,8)
ind2 <- which(cond1 & cond2, arr.ind=TRUE)
ind2 <- matrix(ind2[ind2[,2]!=1,],ncol=2)
if (length(ind2) > 0) value[ind2[,1]] <- substr(columns[ind2[,2]-1],7,8)

你能发布预期结果吗?你能发布预期结果吗?我想
purr::reduce
可以被
reduce
取代吗?另外,
psid[,columns2]%in%(97:99)
可以更方便,并且(至少在线性扫描次数很少的情况下)效率更高。@alexis_laz:谢谢您的反馈。如果我们将数据帧转换为矩阵,然后按照您的建议使用%
中的
%in%
,我相信没有必要使用
reduce
。您说得对,它需要转换,我错过了
psid
是一个“data.frame”。那么我想,人们也可以预先转换成“矩阵”,这将有利于所有的二进制操作。谢谢!我想
purr::reduce
可以被
reduce
取代吗?另外,
psid[,columns2]%in%(97:99)
可以更方便,并且(至少在线性扫描次数很少的情况下)效率更高。@alexis_laz:谢谢您的反馈。如果我们将数据帧转换为矩阵,然后按照您的建议使用%中的
%in%
,我相信没有必要使用
reduce
。您说得对,它需要转换,我错过了
psid
是一个“data.frame”。那么我想,人们也可以预先转换成“矩阵”,这将有利于所有的二进制操作。谢谢!这就行了。
ind=apply(psid,1,function(x) return(which(x[columns] %in% 5 & all(as.numeric(x[columns2]) !=97:99))))
values2=rep("0",nrow(psid))
values2[which(ind>0)]=substr(columns[unlist(ind[which(ind>0)])], 7, 8)
values2
 [1] "1" "2" "2" "3" "4" "0" "0" "0" "1" "0" "3" "1" "3" "2" "3"
 [16] "0" "1" "3" "1" "1" "2" "2" "2" "1" "2" "3" "1" "2" "0" "1"
value <- as.character(rep(0,nrow(psid)))

cond1 <- 5 == psid[,columns]
cond2 <- matrix(as.matrix(psid[,columns2]) %in% (97:99), nrow(psid))
ind1 <- which(cond1 & !cond2, arr.ind=TRUE)
if (length(ind1) > 0) value[ind1[,1]] <- substr(columns[ind1[,2]],7,8)
ind2 <- which(cond1 & cond2, arr.ind=TRUE)
ind2 <- matrix(ind2[ind2[,2]!=1,],ncol=2)
if (length(ind2) > 0) value[ind2[,1]] <- substr(columns[ind2[,2]-1],7,8)
print(value)
## [1] "1" "2" "2" "3" "4" "0" "0" "0" "1" "0" "3" "1" "3" "2" "3" "0" "1" "3" "1" "1" "2" "2"
##[23] "2" "1" "2" "3" "1" "1" "0" "1"