web-dev-qa-db-ja.com

列名のリストに基づいて列をサブセット化し、その前に列を移動します

同じ順序、一意の日付列、データ、一意の日付列、日付などに従う大きなデータセットがあります。データ列だけでなく、一意の日付列もサブセット化しようとしています。以下のコードは、名前のリストに基づいて列を選択します。これは、私が欲しいものの一部ですが、サブセット化された列の直前にも列を取得する方法についてのアイデアはありますか?

DF Date1、Fire、Date3、Earth列を含む(NameListのみを使用)で終わることを目指しています。

これが私の再現可能なコードです:

Cnames <- c("Date1","Fire","Date2","Water","Date3","Earth")
MAINDF <- data.frame(replicate(6,runif(120,-0.03,0.03)))
colnames(MAINDF) <- Cnames

NameList <- c("Fire","Earth")

NewDF <- MAINDF[,colnames(MAINDF) %in% NameList] 
12
Trevor Nederlof

いかがですか

_NameList <- c("Fire","Earth")

idx <- match(NameList, names(MAINDF))
idx <- sort(c(idx-1, idx))

NewDF <- MAINDF[,idx] 
_

ここでmatch()を使用して目的の列のインデックスを見つけ、次にインデックス減算を使用してその前の列を取得できます

11
MrFlick

whichを使用して、名前から列番号を取得します。これは、単純な計算です。

col.num <- which(colnames(MAINDF) %in% NameList)
NewDF <- MAINDF[,sort(c(col.num, col.num - 1))]

生産する

         Date1         Fire        Date3        Earth
1 -0.010908003  0.007700453 -0.022778726 -0.016413307
2  0.022300509  0.021341360  0.014204445 -0.004492150
3 -0.021544992  0.014187158 -0.015174048 -0.000495121
4 -0.010600955 -0.006960160 -0.024535954 -0.024210771
5 -0.004694499  0.007198620  0.005543146 -0.021676692
6 -0.010623787  0.015977135 -0.027741109 -0.021102651
...
9
BrodieG