如何筛选出所有列具有相同编号的行?

时间:2017-10-30 19:43:06

标签: r dplyr

我想过滤掉同一行中所有列中具有相同数据的数据框中的行?在此示例中,我想识别user_id 13。我该怎么做?

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 个答案:

答案 0 :(得分: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
  • q1列与其他q列与.[-1] != q1进行比较,此处. df来自%>%.[-1]删除user_id列;
  • 通过q1忽略NAs来检查有多少列不等于rowSums(.[-1] != q1, na.rm=T);
  • 如果列中的列不相等q1,则所有q列都具有相同的数字,根据它进行过滤;

答案 1 :(得分:1)

除非您的data.frame规模庞大,否则您可以在行(apply)上使用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

答案 2 :(得分:0)

您可以使用一些基本的R代码来解决它。

matrix.translate(position);