РЕДАКТИРОВАТЬ: Если вы хотите удалить только столбцы, имена которых появляются в fe, вы можете просто сделать:
Exp <- data.frame(A.x=1:10,B.y=10:1,C.z=11:20,A.z=20:11)
fe<-LETTERS[1:2]
id <- sapply(strsplit(names(Exp),"\\."),
function(i)!i[1] %in% fe)
Exp[id]
Этот код делает то же самое, что и ваш (обновленный) цикл for, тольконамного эффективнееВам не нужно перебирать fe, функция %in%
векторизована.
Если имя может появиться где-то между точками, тогда
id <- sapply(strsplit(names(Exp),"\\."),
function(i)sum(i %in% fe)==0)
Ваш кодделает некоторые очень забавные вещи, и я понятия не имею, что именно вы пытаетесь сделать.Например, strsplit
дает список, поэтому id == fe[j]
всегда будет возвращать false, если только fe[j]
не является самим списком.И я сомневаюсь, что это ... Так что я бы исправил ваш код как
id = strsplit(colnames(Exp)[i],"\\.")[[1]][1]
, если вы хотите сравнить со всем, что находится перед точкой, или с
id = unlist(strsplit(colnames(Exp)[i],"\\."))
если вы хотите сравнить со всем в строке.В этом случае вы должны также использовать %in%
вместо ==
.
Во-вторых, вы получите матрицу символов, которая по существу умножает строки.если все элементы в fe [j] уникальны, вы также можете сделать:
only <- rbind(names(exp),exp)
only <- do.call(cbind,lapply(mat,function(x)
matrix(rep(x,ncol(exp)-1),nrow=nrow(exp)+1)
))
Предполагая, что логика в вашем коде имеет смысл (поскольку вы не применили некоторые примеры данных, это невозможнознаете), выполняется оптимизация:
mat <- rbind(names(Exp),Exp)
do.call(cbind,
lapply(mat, function(x){
n <- sum(!fe %in% strsplit(x[1],"\\.")[[1]][1])
matrix(rep(x,n),nrow=nrow(mat))
}))
Обратите внимание, что - если вам интересно, если fe [j] появляется где-нибудь в имени - вы можете изменить код на:
do.call(cbind,
lapply(mat, function(x){
n <- sum(!fe %in% unlist(strsplit(x[1],"\\.")))
matrix(rep(x,n),nrow=nrow(mat))
}))
Если это не возвращает того, что вы хотите, то ваш код тоже не делает этого.Я проверил следующие примеры данных, и все дает тот же результат:
Exp <- data.frame(A.x=1:10,B.y=10:1,C.z=11:20,A.z=20:11)
fe <- LETTERS[1:4]