1

列名が z_1、z_2 から z_200 までのデータ フレームがあります。次の例では、わかりやすくするために z_1 のみを示しています。

df <- data.frame(x=1:5, y=2:6, z_1=3:7, u=4:8) 
df
i=1
tmp <- paste("z",i,sep="_")
subset(df, select=-c(tmp))

上記のコードは、データ フレームから削除する必要がある特定の要素にアクセスするためにループ i で使用されます。

上記のコードを実行すると、「-c(tmp) のエラー: 単項演算子の引数が無効です」というエラーが表示されます。

ご協力ありがとうございました

4

2 に答える 2

1

試す:

df[names(df)!=tmp]

コードが機能しない理由は-c(tmp)tmpが文字であり、何も評価されないためです。この除外方法は、数値のみで使用できます。

あるいは、これも機能します:

subset(df, select=-which(names(df)==tmp))

which数字を返すからです。

于 2012-05-11T10:51:28.553 に答える
1

サブセットを使用し、類似した名前の多数の列を含めたり除外したりしたい場合、通常、使用greplして列名に一致する論理ベクトルを作成することを考えます (または、それを使用して数値ベクトルを簡単に作成することもできます)。 )。結果を否定すると、列が削除されます

df <- data.frame(x=1:5, y=2:6, z_1=3:7, u=4:8) 
df
i=1
tmp <- paste("z",i,sep="_")
subset(df, select= !grepl("^z", names(df) ) )
  x y u
1 1 2 4
2 2 3 5
3 3 4 6
4 4 5 7
5 5 6 8

否定を使用すると、そのパターンを使用して "z" で始まるすべての列を削除 (または含めずに) できます。または、文字値と組み合わせて with をgrep使用できます。value =TRUE

subset(df, select= c("x", grep("^z", names(df), value=TRUE ) ) )
于 2012-05-11T11:44:15.507 に答える