相关疑难解决方法(0)

如何在data.table non-equi join中保持join列不变?

我试图删除列中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)

r data.table

8
推荐指数
1
解决办法
500
查看次数

什么<表示在data.table中加入on =

加入数据表:

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)

r left-join data.table

8
推荐指数
2
解决办法
300
查看次数

在没有明确提及的情况下检索列

大家早上好

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)

r left-join data.table

5
推荐指数
0
解决办法
119
查看次数

子集由多个范围组成

我想得到一个介于多个范围之间的值列表.

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)

但实际数据集非常大,我正在寻找一种更有效的方法.

任何建议表示赞赏!谢谢!

r range subset data.table

3
推荐指数
2
解决办法
1376
查看次数

标签 统计

data.table ×4

r ×4

left-join ×2

range ×1

subset ×1