2017-01-30 12 views
1

私はRでクリーニングしようとしているいくつかの反復測定データを持っています。この時点で、それは長い形式であり、私はワイドフォーマットに移行する前にいくつかの項目を修正しようとしています。たとえば、人々が私の調査をあまりにも多く回して行を落とす場合です。条件に基づいてdata.frameから行を削除

がエントリー

を変更する誰かが「プレテストリンク」からアンケートを取った場合、それが実際に事後テストすることになった、I:私は私が解決しようとしている二つの主要な問題を抱えています[次のコードでそれを固定mは:

data[data$UserID == 52118254, "Prepost"][2] <- 2 

これはポストテストとして符号化される第2のエントリを変更し、その後、IDに基づいて、その人からエントリを除外。このコードには、それを見直すと何が起こっているかが分かります。例えば、誰かが誤って二回私のリンクをクリックした場合 - 私は余分な行を削除するには、意味のあるコードを取得するために苦労していた行

を削除

UserID Prepost Duration..in.seconds. 
1 52118250  1     357 
2 52118284  1     226 
3 52118284  1     11 #This is an extra attempt to remove 
4 52118250  2     261 
5 52118284  2     151 
#to reproduce: 
structure(list(UserID = c(52118250, 52118284, 52118284, 52118250, 52118284), Prepost = c("1", "1", "1", "2", "2"), Duration..in.seconds. = c("357", "226", "11", "261", "151")), class = "data.frame", row.names = c(NA, -5L), .Names = c("UserID", "Prepost", "Duration..in.seconds.")) 

私はそれを何度もしてきましたし、私は簡単にデータセットからこれらの行を削除する方法を探しています誰が見てユーザーIDによってフィルタリングすることができます:私は次のようなデータを持っています。この場合、UserID 52118284はそれを3回取っており、2回目の試みは削除する必要があります。より良い他の修正のように "読み取り可能"な場合。

+0

おそらく 'df [!duplicated(interaction(df $ UserID、df $ Prepost))]]? –

+0

@A体系的な問題があってもうまくいくと思うが、どちらかといえば何かが間違っているかを判断しなければならない。 –

答えて

0

ありがとうございました。私が欲しかった一つの基準は、コードを "読む"ように意味があるということでした。私がもっと思ったように、もう一つの基準は、何を変えるべきかについて熟考したかったということです。そこで私はSimonの勧告を取り入れて別の列を作成し、dplyr::filter()を使ってこれらの変数を除外しました。ここでは、コードの例のセグメントは、ように見えたものです:私の状況では

#Change pre/post entries 
data[data$UserID == 52118254, "Prepost"][2] <- 2 

#Mark rows to delete 
data$toDelete <- NA #Makes new empty column for marking deletions 
data[data$UserID == 52118284,][2, "toDelete"] <- 1 #Marks row for deletion 

#Filter to exclude rows 
data %>% filter(is.na(toDelete)) 
    #Optionally add "%>% select(-toDelete)" to remove the extra column 

、ここでの利点は、すべてが意図的ではなく、自動化されて、変更がデータではなく、変更される可能性があります行番号に固定されているということです。私はまだこれを達成するためのフィードバックや他の方法を歓迎します(たぶん、単一のステップで)。

1

私はdplyrのコレクションを以下のように使用します。説明する:

group_by(UserID)は、各ユーザーに個別に機能を適用するのに役立ちます。
mutate(click_n = row_number())は、ユーザーの外見を繰り返しカウントし、新しい変数click_nとして保存します。

library(dplyr) 

data %>% 
    group_by(UserID) %>% 
    mutate(click_n = row_number()) 
#> Source: local data frame [5 x 4] 
#> Groups: UserID [4] 
#> 
#>  UserID Prepost Duration..in.seconds. click_n 
#>  <dbl> <chr>     <chr> <int> 
#> 1 52118254  1     357  1 
#> 2 52118284  1     226  1 
#> 3 52118284  1     11  2 
#> 4 52118250  2     261  1 
#> 5 52118280  2     151  1 

filter(click_n == 1)次いで、以下に示すようにのみ第1の試みを維持するために使用することができます。

data <- data %>% 
    group_by(UserID) %>% 
    mutate(click_n = row_number()) %>% 
    filter(click_n == 1) 
data 
#> Source: local data frame [4 x 4] 
#> Groups: UserID [4] 
#> 
#>  UserID Prepost Duration..in.seconds. click_n 
#>  <dbl> <chr>     <chr> <int> 
#> 1 52118254  1     357  1 
#> 2 52118284  1     226  1 
#> 3 52118250  2     261  1 
#> 4 52118280  2     151  1 

この方法では、データフレームが注文されていることを前提としています。すなわち、最初のクリックは上部の近くに表示されます。

%>%についてよくわからない場合は、「パイプオペレータ」のヘルプをご覧ください。 EXTRA

data %>% group_by(UserID) %>% filter(row_number() == 1)

+0

ありがとうございます。私は 'dplyr'、' mutate'、 'row_number'に精通しています。これは、削除する行を「マーキングする」中間的なステップのために機能します。実際に私は自分の変更と同様に、これらの削除のための変数を作成し、一度にすべてを削除することができます。 –

+0

もしあなたがそれに精通していれば、 'mutate'行をスキップして' data%>%group_by(UserID)%>%filter(row_number()== 1) 'に直接行くことができます。私はこれを追加して他の人にも答えました。 –

2

A:

はあなたがここで何が起こっているかに慣れたら、あなたはスキップすることができ、その答えに以下単に行うmutate行をコメントを持参します重複を削除するための簡単な解決策は以下の通りです:

subset(data, !duplicated(data$UserID)) 

しかし、あなたはまた、duratioによってサブセット化を検討することをお勧めしますn、例えば、持続時間が30秒未満の場合。

+0

今は長いデータ形式になっているので、重複しておく必要があります。重複したUserIDとPrepostの値でフィルタリングしたとしても、それ以上のコントロールが必要です。編集:私のサンプルデータが少し間違っていることに気付きました.2つのIDしかないので、もう一度見てください。 –

関連する問題