【问题标题】:Adding column with information from another dataframe R使用来自另一个数据框 R 的信息添加列
【发布时间】:2021-05-01 16:00:10
【问题描述】:

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

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

      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

谢谢!

【问题讨论】:

  • merge(df1, df2)?
  • 还可以查看various joinsdplyr(您已标记)...例如,您可以执行inner_join(df1, df2),这将包括df1 和@987654329 中的行@匹配eleno
  • 我使用 dplyr 作为标签,因为我认为它可以用于解决我的问题,但我无法使用它进行编码......那么,你知道我该怎么做吗?跨度>

标签: r dataframe join dplyr tidyverse


【解决方案1】:

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

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 循环逐点对原始数据帧进行子集化,同时应用我们的原始代码并将我们的singular 字符元素附加回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_column绑定到df1

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
)

【讨论】:

  • 这不是我所需要的,因为对于第 1 点 (eleno = 1),我计算了多个距离,而不仅仅是一个。您报告为新列的值仅适用于 eleno = 1。请查看已编辑的问题
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 2021-11-02
  • 2022-01-09
  • 2023-03-05
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
相关资源
最近更新 更多