我想过滤掉同一行中所有列中具有相同数据的数据框中的行?在此示例中,我想识别user_id
1
和3
。我该怎么做?
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")
答案 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);