2016-11-23 9 views
1

データフレームdfが文字列(character)と文字列のリストで構成されています。のは、次の例を見てみましょう:Rデータフレームサブセット:リスト内の値を検索

Name  Nationality 
'Alice' "USA" 
'Bob'  "MEX" 
'Eve'  c("USA", "MEX") 

つまり:

> dput(df) 
structure(list(Name = c("Alice", "Bob", "Eve"), Nationality = list( "USA", "MEX", c("USA", "MEX"))), .Names = c("Name", "Nationality"), row.names = c(1L, 2L, 3L), class = "data.frame") 

国籍として少なくとも "MEX" を持っているすべての行を抽出するためにどのように?

予想される出力:

Name  Nationality 
'Bob'  "MEX" 
'Eve'  c("USA", "MEX") 

編集:

  • df[df$Nationality == "MEX", ]を、それだけでボブを返します。私が試してみました。
  • df[df$Nationality %in% "MEX",] Bobのみが返されます。 '国籍' 列がある
  • df["MEX" %in% df$Nationality,]戻り値すべて、ちょうどdf[is.element("MEX", df$Nationality),]
のみ

df[grep("MEX", df$Nationality), ]よう取り組んでいます...

+1

使用 'grep'として簡素化することができる

df[sapply(lapply(df$Nationality, '%in%', "MEX"), any),] # Name Nationality #2 Bob MEX #3 Eve USA, MEX 

に基づいて行をサブセットに、MEX "すなわちdf [grep(" MEX "、df $ nationality)]、'。 'dput'を使って例を表示してください – akrun

+0

コードをチェックすると、'サブセット ' – akrun

+0

@akrunが実行されています(コードが私の問題を解決しています)。ありがとうございました!再現可能な例を得るために質問を編集します。 – ebo

答えて

1

(同上... %in% c("MEX"),]用) list(長さ3)です。したがって、列をループしてが存在するかどうかを確認できます「MEX」%in%list要素が論理的vectorを取得し、3番目のエントリは「USAであればそれはまた

df[sapply(df$Nationality, function(x) "MEX" %in% x),] 
+1

ありがとうございます。結果が同じであっても、これはgrepよりははるかに論理的です(あなたの説明には明白です)。 – ebo

0
df["MEX" %in% df$Nationality,] 

または

df[is.element("MEX", df$Nationality),] 
+0

実際に私の例では動作しません。 (ただし、akrunの解答( 'df [grep(" MEX "、df $ nationality)]))はそうです。 'dput 'で再現可能にする – ebo

+0

これは、' df $国籍'の値が 'c(" USA "、" MEX ")'ではないことを意味するはずです(実際には、ベクトル値の項目をデータフレーム...私はそれを忘れていた)。 @akrunは言ったように、 '' USA、MEX "'のように単一の文字列として保存される可能性が最も高いです。 '' grep 'はあなたの望む結果を得る正しい方法です。 – victor

関連する問題