2017-10-30 6 views
1

同じ行のすべての列で同じデータを持つデータフレームの行をフィルタリングしたいのですが?この例では、user_id13を識別したいと考えています。それ、どうやったら出来るの?すべての列に対して同じ番号を持つ行をフィルタリングする方法は?

df <- read_csv("user_id, q1, q2, q3, q4 
1, 5, 5, 5, 5 
2, 4, 3, 5 ,6 
3, 2, 2, 2, 2 
4, 5, 4, NA, 4") 

目的:アンケートにすべての質問を同じボックスに入れる人を特定する。

更新:提案された解決策は、q1がNAになるまでうまく動作します。

df <- read_csv("user_id, q1, q2, q3, q4 
       1, 5, 5, 5, 5 
       2, NA, 3, 5 ,6 
       3, 2, 2, 2, 2 
       4, 5, 4, NA, 4") 

答えて

3

あなたが質問の一つ、例えばq1を選択し、他の質問とそれを比較し、すべての質問が等しい場合は選択することができます。

df$user_id[rowSums(df$q1 != df[-1], na.rm=T) == 0] 
# [1] 1 3 

df %>% filter(rowSums(.[-1] != q1, na.rm=T) == 0) 

# A tibble: 2 x 5 
# user_id q1 q2 q3 q4 
# <int> <int> <int> <int> <int> 
#1  1  5  5  5  5 
#2  3  2  2  2  2 
  • .[-1] != q1と他のqの列を持つq1列の比較、ここ.dfuser_id列をドロップ.[-1]%>%からパイプです。
  • q1と等しくない列の数を確認するには、rowSums(.[-1] != q1, na.rm=T)でNAを無視します。
  • 列の不がq1等しくない場合は、すべてのqの列がそれに基づいて、同じ数、フィルタを有します。
+0

多くのおかげで、Psidom。第二のアプローチが私が必要とするものであるように見えます。コードをもう少し詳しく説明できますか?私はRに非常に新しいです – Tyn

+0

いくつかの説明で更新されました〜 – Psidom

+0

恐ろしい!ありがとう、あなたは人生の節約になります:-) – Tyn

1

あなたdata.frameが巨大である場合を除き、あなたはいくつかの基本的なRコードでそれを解決することができ、行(MARGIN = 1

df$user_id[apply(X = df[,-1], MARGIN = 1, FUN = function(x) length(unique(x)) == 1)] 
#[1] 1 3 

df[apply(X = df[,-1], MARGIN = 1, FUN = function(x) length(unique(x)) == 1),] 
# user_id q1 q2 q3 q4 
#1  1 5 5 5 5 
#3  3 2 2 2 2 

OR

df$user_id[Reduce(function(x, y) pmax(x, y, na.rm = TRUE), df[,-1]) == 
       Reduce(function(x, y) pmin(x, y, na.rm = TRUE), df[,-1])] 
#[1] 1 3 
+1

ありがとうございますdb私は将来、このことを覚えていますので、私は関数を学習していません。 – Tyn

0

applyを使用することができます。

# Generate your data set 
df <- data.frame(user_id =c(1,2,3,4), 
       q1 = c(5,4,2,5), 
       q2 = c(5,3,2,4), 
       q3 = c(5,5,2, NA), 
       q4 = c(5,6,2,4)) 

# populate the vector with a loop 
test <- character(0) 
for(i in 1:nrow(df)){ 
# check if the sum of the values is equal to the sum of the last value 
# repeated. This can only be true if all values are the same 
    if(sum(df[i,2:5], na.rm = TRUE) - sum(rep(df[i,5],4)) == 0){ 
    test[i] <- "equal" 
    } else{ 
    test[i] <- "not_equal" 
    } 

} 

# finally attach the vector as a column to your data frame 
df$test <- test 
関連する問題