首页 > 解决方案 > 使用来自另一个数据框 R 的信息添加列

问题描述

我有两个数据框,我需要加入信息。

这是我有不同点(1,2,3 ..)的第一个df:

      eleno elety resno
        1     N     1
        2    CA     1
        3     C     1
        4     O     1
        5    CB     1
        6    CG     1

第二个表示点之间的距离,“eleno”表示第一个点,“ele2”表示第二个点:

    eleno  ele2    values
   <chr>  <chr>     <dbl>
     1      2       1.46
     1      3       2.46
     1      4       2.86
     1      5       2.46
     1      6       3.83
     1      7       4.47

我想在第一个 df 中有一个新列,其中包含来自 df 2 的信息。例如,对于第 1 点,我想要 -2(second point):1.46(distance) , -3:2.46, -4 :2.86 等,最好在一列中。

像这样的东西

      eleno elety resno  dist
        1     N     1   -2:1.46, -3:2.46, -4:2.86 ...
        2    CA     1
        3     C     1
        4     O     1
        5    CB     1
        6    CG     1

谢谢!

标签: rdataframejoindplyrtidyverse

解决方案


如果我理解您对一列的偏好,那么没有的可能性dplyr如下。首先,我们通过使用函数连接ele2values列来创建新列,用冒号作为分隔符:df2paste()

new_column <- paste(-df2$ele2, df2$values, sep = ":")

然后,我们使用cbind()将其绑定到df1

new_df1 <- cbind(df1, ele2_values = new_column)

这将为我们提供一个新的数据框,如下所示:

  eleno elety resno ele2_values
1     1     N     1     -2:1.46
2     2    CA     1     -3:2.46
3     3     C     1     -4:2.86
4     4     O     1     -5:2.46
5     5    CB     1     -6:3.83
6     6    CG     1     -7:4.47

这是我使用的数据,基于您提供的数据:

df1 <- data.frame(
    eleno = 1:6,
    elety = c("N", "CA", "C", "O", "CB", "CG"),
    resno = rep(1, 6)
)

df2 <- data.frame(
    eleno = rep(1, 6),
    ele2 = 2:7,
    values = c(1.46, 2.46, 2.86, 2.46, 3.83, 4.47)
)

如果我们想将此列作为每个点的单个元素,我们可以通过以下方式修改我们的代码:

实例new_column化为空向量:

new_column <- vector()

然后调用一些变体*apply()或使用 for 循环来逐点对原始数据帧进行子集化,同时应用我们的原始代码并将我们的单数字符元素附加回new_column

lapply(unique(df2$eleno), FUN = function(x) {
    subset     <- subset(df2, eleno == x)
    new_elem   <- paste(-subset$ele2, subset$values, sep = ":", collapse = ", ")
    new_column <<- c(new_column, new_elem)
})

一旦这个操作完成,我们cbind()像以前一样使用绑定new_columndf1

new_df1 <- cbind(df1, ele2_values = new_column)

我们的输出如下,

  eleno elety resno                                                                                                                   ele2_values
1     1     N     1  -2:1.13703411305323, -3:6.22299404814839, -4:6.09274732880294, -5:6.23379441676661, -6:8.60915383556858, -7:6.40310605289415
2     2    CA     1 -2:0.094957563560456, -3:2.32550506014377, -4:6.66083758231252, -5:5.14251141343266, -6:6.93591291783378, -7:5.44974835589528
3     3     C     1  -2:2.82733583590016, -3:9.23433484276757, -4:2.92315840255469, -5:8.37295628152788, -6:2.86223284667358, -7:2.66820780001581
4     4     O     1 -2:1.86722789658234, -3:2.32225910527632, -4:3.16612454829738, -5:3.02693370729685, -6:1.59046002896503, -7:0.399959180504084
5     5    CB     1   -2:2.18799541005865, -3:8.10598552459851, -4:5.25697546778247, -5:9.14658166002482, -6:8.3134504687041, -7:0.45770263299346
6     6    CG     1   -2:4.56091482425109, -3:2.65186671866104, -4:3.04672203026712, -5:5.0730687007308, -6:1.81096208281815, -7:7.59670635452494

这是我在这种情况下使用的随机数据:df2

set.seed(1234)
df2 <- data.frame(
    eleno = rep(1:6, rep(6, 6)),
    ele2 = 2:7,
    values = runif(length(rep(1:6, rep(6, 6)))) * 10
)

推荐阅读