我试图删除列中data.frame的值posn不在另一个中给出的范围内的行data.frame,具有data.table非equi连接功能.
以下是我的数据的样子:
library(data.table)
df.cov <-
structure(list(posn = c(1, 2, 3, 165, 1000), att = c("a", "b",
"c", "d", "e")), .Names = c("posn", "att"), row.names = c(NA,
-5L), class = "data.frame")
df.exons <-
structure(list(start = c(2889, 2161, 277, 164, 1), end = c(3329,
2826, 662, 662, 168)), .Names = c("start", "end"), row.names = c(NA,
-5L), class = "data.frame")
setDT(df.cov)
setDT(df.exons)
df.cov
# posn att
# 1: 1 a
# 2: 2 b
# …Run Code Online (Sandbox Code Playgroud) 加入数据表:
X <- data.table(A = 1:4, B = c(1,1,1,1))
# A B
# 1: 1 1
# 2: 2 1
# 3: 3 1
# 4: 4 1
Y <- data.table(A = 4)
# A
# 1: 4
Run Code Online (Sandbox Code Playgroud)
通过
X[Y, on = .(A == A)]
# A B
# 1: 4 1
Run Code Online (Sandbox Code Playgroud)
返回预期结果.但是,我希望这条线:
X[Y, on = .(A < A)]
# A B
# 1: 4 1
# 2: 4 1
# 3: 4 1
Run Code Online (Sandbox Code Playgroud)
回来
A B
1: 1 1 …Run Code Online (Sandbox Code Playgroud) 大家早上好
在data.table我发现使用左连接时,当隐式提及列名时,即不提及表(列所在的表)会导致意外的结果,尽管列名是唯一的。
虚拟数据
x <- data.table(a = 1:2); x
# a
# 1: 1
# 2: 2
y <- data.table(c = 1
,d = 2); y
# c d
# 1: 1 2
Run Code Online (Sandbox Code Playgroud)
左连接在检索列 c 时不提及表名
z <- y[x, on=.(c=a), .(a,c,d)]; z
# a c d
# 1: 1 1 2
# 2: 2 2 NA
Run Code Online (Sandbox Code Playgroud)
查看上述结果时出现问题。c 列的第 2 行应该是NA. 但是,它显示2
这仅在用户明确提及该表时才得到纠正:
z <- y[x, on=.(c=a), .(a,x.c,d)]; z
# a x.c d
# 1: 1 …Run Code Online (Sandbox Code Playgroud) 我想得到一个介于多个范围之间的值列表.
library(data.table)
values <- data.table(value = c(1:100))
range <- data.table(start = c(6, 29, 87), end = c(10, 35, 92))
Run Code Online (Sandbox Code Playgroud)
我需要结果只包含介于这些范围之间的值:
results <- c(6, 7, 8, 9, 10, 29, 30, 31, 32, 33, 34, 35, 87, 88, 89, 90, 91, 92)
Run Code Online (Sandbox Code Playgroud)
我目前正在使用for循环,
results <- data.table(NULL)
for (i in 1:NROW(range){
results <- rbind(results,
data.table(result = values[value >= range[i, start] &
value <= range[i, end], value]))}
Run Code Online (Sandbox Code Playgroud)
但实际数据集非常大,我正在寻找一种更有效的方法.
任何建议表示赞赏!谢谢!