編集:名前が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)
あなたのコードはいくつかの非常に面白いことをします、そして私はあなたが何をしようとしているのか正確にはわかりません。1つ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]