R中数据集的偏移联接

时间:2018-10-03 12:42:00

标签: r dplyr data.table

有数据

data1=structure(list(y1 = c(3L, 5L, 6L, 7L, 5L), y2 = c(5L, 7L, 8L, 
9L, 5L)), .Names = c("y1", "y2"), class = "data.frame", row.names = c(NA, 
-5L))

它是两个变量(y1,y2)。

y1  y2
3   5
5   7
6   8
7   9
5   5

实际上有5行

1,2,3,4,5

还有另一个数据集

data2=structure(list(v1 = 1:2, v2 = c(1L, 3L), x = c(10L, 30L)), .Names = c("v1", 
"v2", "x"), class = "data.frame", row.names = c(NA, -2L))

v1  v2  x
1   1   10
2   3   30
v1的

1,2和v2的1,3,这是行数。 所以我必须加入v1的第一行和v2的第一行 y1的第一行和y2的第一行

然后 v1的第二行,我必须与y1的第二行和v2的第三行联接,我必须与y2的3行联接

如此输出

y1  y2  v1  v2  x
3   5   1   1   10
5   8   2   3   30

如果该帖子重复,请告诉我,我将其删除。

让我编辑帖子更加清晰

data2

v1  v2
1   1
3   5
4   8
7   9

每个变量都表示必须在data1中加入的行

此处data1

      y1    y2

    `21     45
    q456    346
    q346    3q6
    yq      ewy
    wey     4e
    werer   yu
    ytu 256
    4323    62546u4
    ftyb    bynj
    dfgg    2335
    ye     4556
    1       2


V1 =1 must be joint with first row of y1
v2=1 must be joint with first row of y2
v1=3  must be joint with third row of y1
v2=5 must be joint with five row of y2
v1=4  must be joint with 4 row of y1
v2=8 must be joint with 8 row of y2
v1=7  must be joint with 7 row of y1
v2=9 must be joint with 9 row of y2

输出

v1  v2  y1  y2
1   1   `21 45
3   5   q346    4e
4   8   yq  62546u4
7   9   ytu bynj

1 个答案:

答案 0 :(得分:2)

如果我理解正确,data2包含data1中的行索引。 OP希望通过分别在data2y1给定的行中查找y2v1的值来更新v2。< / p>

使用data.table可以通过两种不同的方法来解决

通过引用查找和更新

library(data.table)
setDT(data1)
setDT(data2)
data2[, y1 := data1[v1, y1]]
data2[, y2 := data1[v2, y2]]
data2
   v1 v2   y1      y2
1:  1  1  `21      45
2:  3  5 q346      4e
3:  4  8   yq 62546u4
4:  7  9  ytu    bynj

更新加入

library(data.table)
setDT(data2)[setDT(data1)[, rn := .I], on = .(v1 = rn), y1 := i.y1][
  data1, on = .(v2 = rn), y2 := i.y2]
data2
   v1 v2   y1      y2
1:  1  1  `21      45
2:  3  5 q346      4e
3:  4  8   yq 62546u4
4:  7  9  ytu    bynj

在这里,辅助列附加到data1上,其中包含要加入的行索引。

数据

library(data.table)
data2 <- fread("
v1  v2
1   1
3   5
4   8
7   9
")

data1 <- fread("
y1    y2
`21     45
q456    346
q346    3q6
yq      ewy
wey     4e
werer   yu
ytu 256
4323    62546u4
ftyb    bynj
dfgg    2335
ye     4556
1       2
")