我的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列中的任何位置,而不是简单地在同一行中。
答案 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)