2016-09-12 4 views
2

data.frameで文字列を検索するにはどうすればよいですか?最小限の例として、このdata.frameで '馬'の位置(列と行)を見つけるにはどうすればよいですか?data.frameで文字列を検索

> df = data.frame(animal=c('goat','horse','horse','two', 'five'), level=c('five','one','three',30,'horse'), length=c(10, 20, 30, 'horse', 'eight')) 
> df 
    animal level length 
1 goat five  10 
2 horse one  20 
3 horse three  30 
4 two 30 horse 
5 five horse eight 

...行4と5の順序が間違っています。 「馬」が5行目のlevel列に、4列目のlength列に移動していることを確認できる出力があれば良いです。多分:

> magic_function(df, 'horse') 
col  row 
'animal', 2 
'animal', 3 
'length', 4 
'level', 5 

は、ここで私はこれを使いたいものです:私はいくつかの列がいくつかの行のために台無しにされている非常に大規模なデータ・フレーム(約60列、20.000行)を持っています。順序が間違っている可能性があるさまざまな方法を特定するために眼球には大きすぎるので、検索がうまくいくでしょう。この情報を使用して、これらの行の正しい列にデータを移動します。

何について
+0

正しい順番と結果は何ですか? –

+0

@TimBiegeleisen質問を更新しました。 「場所」によって、私は列と行を意味しました(データフレームは2Dです)。私は秩序を変える方法を尋ねていません - 私はそれを行う方法を知っています。私の問題の文脈を提示するだけでした。私は実際の60列を貼り付けることに価値はないと思うが、皆さんが最小限の例を求めているので、;-)しかし、私の最小限の例では、最初の3行の順序が正しいとし、データが間違った列にあるとしましょう。行4と5。 –

+1

"hat 'horse'が行5のレベル列に移動しました。:あなたの例の「馬」行5はありません。私はそこをやめた。 – Tensibai

答えて

6

:あなたは出力が行列になりたい場合は

l <- sapply(colnames(df), function(x) grep("horse", df[,x])) 

$animal 
[1] 2 3 

$level 
[1] 5 

$length 
[1] 4 

sapply(l,'[',1:max(lengths(l))) 

    animal level length 
[1,]  2  5  4 
[2,]  3 NA  NA 
+0

ニース。 OPの問題について考えてみると、データフレームの各列に対して呼び出される 'count(df $ animal)'と組み合わせることになります。これは、列内で発生するレベルごとの発生回数を返し、異常値を検出しやすくします。 'count'を使うためには、まず' library(plyr) 'が必要です。 – larsen

+2

@larsen、 'colSums(df == '馬')'はこれを行うためのより良い方法です。 –

+0

@Jonasありがとうございます。しかし、それはやや異なる問題を解決するだろうと思う。たぶん私は疑問を誤解しましたが、不正なデータでは、列の値が間違っているかどうかを事前に知ることはできません。私が提案した手法は、間違った値を検出することを目的としています。 – larsen

3

別の方法horseに等しい。行インデックス(nrow)で列のインデックスを取得し、列(ncol)で行インデックスを取得します。

colnamesを使用してインデックスの代わりに列名を取得します。

data.frame(col = colnames(df)[floor(which(df == "horse")/(nrow(df) + 1)) + 1], 
      row = floor(which(df == "horse")/ncol(df)) + 1) 

# col row 
#1 animal 1 
#2 animal 2 
#3 level 4 
#4 length 5 
0

我々は価値があるインデックスを取得することができます周り

which(df == "horse", arr.ind = TRUE) 
#  row col 
# [1,] 2 1 
# [2,] 3 1 
# [3,] 5 2 
# [4,] 4 3