2017-08-26 7 views
0

データフレームの異なるバージョンで名前を変更できる列の値に従ってデータフレームをサブセット化しようとしています。私がテストしたい値は "SIC"または "NAICS"という名前の列に "----"です。条件付き列名によるサブセットデータフレーム

バージョン1:

df 
    MSA SIC EMPFLAG EMP 
1 40 ----   43372 
2 40 07--   192 
3 40 0700   192 

バージョン2:

df 
    MSA NAICS EMPFLAG EMP 
1 40 ----   78945 
2 40 07--   221 
3 40 0700   221 

期待する結果は:

バージョン1:

df 
    MSA EMP 
1 40 43372 

バージョン2:

df 
    MSA EMP 
1 40 78945 

次のコードは動作しません:

df <- ifelse("SIC" %in% colnames(df), 
      df[df$SIC=="----", c("MSA", "EMP")], 
      df[df$NAICS=="----", c("MSA", "EMP")]) 

答えて

1

あなたが本当にそれを必要としないとき、あなたのコードの問題は、ベクトル化ifelseの使用です。

df <- if(any(grepl("SIC", colnames(df)))) { 
     df[df$SIC=="----", c("MSA", "EMP")] 
     } else { 
     df[df$NAICS=="----", c("MSA", "EMP")] 
     } 
df 

おそらく簡単ですあなたも%in%を使用することができます。

df <- if(any("SIC" %in% colnames(df))){ 
     df[df$SIC=="----", c("MSA", "EMP")] 
     } else { 
     df[df$NAICS=="----", c("MSA", "EMP")] 
     } 

最後に、ウィリアム・アシュフォードで答えを読んだ後、以下のワンライナーは、あなたが求めてきました正確に何を行います。問題の列が常に2番目の列であるという事実を使用してください。

df <- df[df[, 2] == "----",-which(names(df) %in% c('SIC','NAICS','EMPFLAG'))] 

これのクレジットは彼に向かっています。

0

そのあなたのデータフレームは、このようなHow to drop columns by name in a data frame

サブセットで見られるように、

df = df[,-which(names(df) %in% c('SIC','NAICS'))] 

これはので、私はあなたが質問を投稿する前にSOを通して見てみる示唆mightsを見つけることは非常に簡単な答えでした。

+0

@ WilliamAshford列を削除することは、私が達成しようとしていることに二次的です。私はそれを削除する前に列の値をテストする必要があります。 – syre

+0

これは元の投稿の後に追加されましたが、私はそれを実行可能にするために回答を修正するよう努めます。 – Will

+0

ルイ・バラダスの答えの単純さでは、私が大きく上げることはできないので、無視してください。 – Will