6

列名の特定のサブセットを抽出したデータフレーム AData があり、SpecialNames と言います。for ループでこれらの列を参照する方法を知りたいです。

私の現在のコードは次のようになります。

SpecialNames <- setdiff(colnames(AData), colnames(BData))

for ( i in SpecialNames ) {

    AData$i <- NULL # Do something to AData$i such as delete it or something else

}

残念ながら、AData$i はデータフレーム AData の列を i という名前で参照していないようです。私にそれを与える別の構文はありますか?

私はこの投稿をここで読みました: [[paste0(i, '.impt')]]".

このコメントに基づいて、おそらく私が探していた構文は AData$[i] または AData$[[i]] または AData$[[paste0(i)]] であると推測しましたが、これらのいずれも機能していないようです。

何か案は?

4

3 に答える 3

4

あなたはあなたのループに非常に近いです. と の使用と意味には、あなたが見逃している微妙な機能があり[ます[[. 詳細については、Hadley Wickham によるサブセット化に関するこのメモを参照してください。

必要なパフォーマンスを得るには (列を削除するように割り当てるNULL)、 を使用する必要があります[[。を使用mydf[, specialnames] <- NULLするとエラーがスローされます。

私はこれがうまくいくように、やや混乱していることに同意しmydf[, specialnames] <- NAます:私はそれが前者の構造を変更しdata.frame、後者がそうしないことについてだと思います...

したがって、関数は次のようになります。

for (name in specialnames) { 
   mydf[[name]] <- NULL
}

設定すると、次のようになります。

set.seed(1)
mydf <- data.frame(A = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4),
               B = LETTERS[c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2)],
               matrix(sample(100, 36, replace = TRUE), nrow = 12))

## Here is your vector of special names
specialnames <- setdiff(names(mydf), c("A", "B"))

ループの後、次のようになります。

R> mydf
   A B
1  1 A
2  1 A
3  1 A
4  2 A
5  2 A
6  3 B
7  3 B
8  3 B
9  3 B
10 4 B
11 4 B
12 4 B
于 2013-11-07T18:25:17.680 に答える
1

ループは必要ありませんfor。列に直接アクセスできます。次に例を示します。

Adata <- data.frame(a=rnorm(5), b=rnorm(5), c=rnorm(5))
SpecialNames <- c("b", "c")
Adata[,SpecialNames] <- NA

あなたにあげる:

            a  b  c
1 -0.95619055 NA NA
2 -0.20250939 NA NA
3 -1.06609997 NA NA
4  0.06337307 NA NA
5  0.77234892 NA NA

を使用しますNULLか? NAは通常、欠損値に使用されます。こちらを参照してください。

于 2013-11-07T15:44:08.400 に答える