2016-07-14 13 views
3

私はいくつかの文字変数を持つデータフレームを持っています。行ごとに複数の列に複製された特定の文字列だけが、NAで囲まれています。 I.データフレーム「DF」:データフレーム変数内でユニークな文字列を見つける

Col1 Col2 Col3 
1 ABC ABC NA 
2 NA DEF DEF 
3 GHI NA NA 
4 JKL JKL JKL 

出力としてI希望

ABC 
DEF 
GHI 
JKL 

を有するようにベスト行ごとに関数を適用するいくつかの種類を持っているだろう。私はいくつかのバリエーションを試しました

apply(df,1, function(x) unique(x)) 

しかし、それは成功しませんでした。あなたは正しい機能を知っていれば、かなり簡単な方法があると思いますか?どうやってやるの?

+1

行ごとに1つの固有の要素がある場合(その行または行に複製される場合があります。あなたはループなしで 'df [cbind(1:nrow(df)、max.col(!is.na(df)))]'を使うことができます –

答えて

3

我々は、行ごとに複数のunique要素が存在する場合、それは要素数が行ごとに異なっているかどうかに応じて(listとして返されNA要素

unname(apply(df, 1, FUN = function(x) unique(x[!is.na(x)]))) 
#[1] "ABC" "DEF" "GHI" "JKL" 

を除去するis.naを使用することができ)。その場合は、私たちは一つの文字列に作成するためにそれらを一緒にpasteでき

unname(apply(df, 1, FUN = function(x) toString(unique(x[!is.na(x)])))) 

do.call(pmax, c(df, list(na.rm=TRUE))) 
#[1] "ABC" "DEF" "GHI" "JKL" 
+1

ありがとう、Akrun。最初は私が好む方法です。私が想定していたように、私は解決策から遠く離れていませんでした。しかし、私はunnameを必要としませんでした。 – Rockbar

1

別のオプションごとに1つだけのユニークな要素がある場合は別のオプションはpmaxある

levels(unlist(df)) 
+0

複数の行に同じ行の値が一度だけ(レベル)報告されるという意味で同じ行の値があったとしても、行ごとに一致しない場合は、失敗する可能性があります。 –

+0

@docendodiscimus:間違いなく。これは状況に応じた解決策です。私は、これが目標を達成するためのこの特定の問題の最も簡単な方法だと思います。 – user2100721

関連する問題