使用%in

时间:2015-09-30 02:46:35

标签: r data.table

我的data.table的程式化版本是

outmat <- data.table(merge(merge(1:5, 1:5, all=TRUE), 1:5, all=TRUE))

我想要做的是根据是否在任何其他列中找到第1列中的值来从此data.table中选择行的子集(它将处理未知维度的矩阵,因此我可以& #39; t只是使用某种&#34; row1 == row2 | row1 == row3&#34;

我想用

这样做
output[row1 %in% names(output)[-1], ]

但如果在row2或row3的任何行中找到row1中的值,则最终返回TRUE,这不是预期的行为。它有某种%in%的矢量化版本可以实现我想要的结果吗?

详细说明,我想得到的是从1:5集合中的3元组的枚举,用替换绘制,这样第一个值与第二个或第三个值相同,如:

1 1 1
1 1 2
1 1 3
1 1 4
1 1 5
...
2 1 2
2 2 1
...
5 5 5

我的代码改为给我的是3元组的每个枚举,因为它检查第一个数字(比如说5)是否出现在第2列或第3列中的任何位置,而不是简单地在同一行中。

2 个答案:

答案 0 :(得分:3)

一种选择是构造表达式并对其进行评估:

dt = data.table(a = 1:5, b = c(1,2,4,3,1), c = c(4,2,3,2,2), d = 5:1)
#   a b c d
#1: 1 1 4 5
#2: 2 2 2 4
#3: 3 4 3 3
#4: 4 3 2 2
#5: 5 1 2 1

expr = paste(paste(names(dt)[-1], collapse = paste0(" == ", names(dt)[1], " | ")),
             "==", names(dt)[1])
#[1] "b == a | c == a | d == a"

dt[eval(parse(text = expr))]
#   a b c d
#1: 1 1 4 5
#2: 2 2 2 4
#3: 3 4 3 3

另一个选择是循环并比较列:

dt[rowSums(sapply(dt, '==', dt[[1]])) > 1]
#   a b c d
#1: 1 1 4 5
#2: 2 2 2 4
#3: 3 4 3 3

答案 1 :(得分:0)

library(dplyr)
library(tidyr)

dt %>%
  mutate(ID = 1:n() )
  gather(variable, value, -first_column, -ID) %>%
  filter(first_column == value) %>%
  select(ID) %>%
  distinct %>%
  left_join(dt)