【问题标题】:Iteratively subtract vectors in dataframe迭代地减去数据框中的向量
【发布时间】:2018-09-18 00:20:31
【问题描述】:

那里有类似的问题,但我非常有信心这个问题是独一无二的。

我有一个大型数据框,其中包含数字向量和各种 ID 的变量。

> dataframe
 ID    ID.2    vectors  
  1     a       c(6, 3, 7, 4, 7, 2, 6)
  1     a       c(4, 7, 2, 7, 4, 7, 8) 
  2     a       c(5, 8, 2, 7, 8, 9, 9)
  2     a       c(6, 9, 7, 2, 6, 8, 9)
  1     b       c(4, 8, 2, 6, 8, 9, 0)
  1     b       c(5, 8, 2, 7, 8, 9, 9)

我需要遍历数据框并通过 ID 变量找到向量之间的差异。所以上面假数据的输出应该是这样的:

> dataframe$difference
c(2, -4, 5, -3, 3, -5, -2)
NA # because difference has been found
c(-1, -1, -4, 5, 2, 1, 0)
NA
c(-1, 0, 0, -1, 0, 0, -9)
NA

这已经(令人惊讶地)复杂地弄清楚了。提前致谢。

【问题讨论】:

  • 请编辑您的问题以包含您的示例data.framedput

标签: r dataframe vector difference


【解决方案1】:

如果是单个数字,您可以使用 diff,但对于向量的列表列(可能),您需要使用 purrr::accumulate(用于连续减法)或 @987654323 等列表操作@(成对)。 dplyr::lead 将向上移动一位并插入 NAs。

library(tidyverse)

df <- data_frame(ID = c(1L, 1L, 2L, 2L, 1L, 1L), 
                 ID.2 = c("a", "a", "a", "a", "b", "b"), 
                 vectors = list(c(6, 3, 7, 4, 7, 2, 6), c(4, 7, 2, 7, 4, 7, 8), c(5, 8, 2, 7, 8, 9, 9), c(6, 9, 7, 2, 6, 8, 9), c(4, 8, 2, 6, 8, 9, 0), c(5, 8, 2, 7, 8, 9, 9)))

df %>% 
    group_by(ID, ID.2) %>% 
    mutate(diff = map2(vectors, lead(vectors), `-`)) %>% 
    as.data.frame()    # for printing
#>   ID ID.2             vectors                       diff
#> 1  1    a 6, 3, 7, 4, 7, 2, 6    2, -4, 5, -3, 3, -5, -2
#> 2  1    a 4, 7, 2, 7, 4, 7, 8 NA, NA, NA, NA, NA, NA, NA
#> 3  2    a 5, 8, 2, 7, 8, 9, 9     -1, -1, -5, 5, 2, 1, 0
#> 4  2    a 6, 9, 7, 2, 6, 8, 9 NA, NA, NA, NA, NA, NA, NA
#> 5  1    b 4, 8, 2, 6, 8, 9, 0     -1, 0, 0, -1, 0, 0, -9
#> 6  1    b 5, 8, 2, 7, 8, 9, 9 NA, NA, NA, NA, NA, NA, NA

【讨论】:

  • 这不是我在运行您的代码或将其应用于我的数据框时得到的。它确实在前两个向量之间产生了正确的差异,但在那之后它看起来像是在累积它们?我实际上无法弄清楚发生了什么。
  • @MeC 哦,我以为你想要连续减法。如果要成对使用,请改用purrr::map2base::Map;查看编辑
  • 效果很好!对不起,我在我的例子中没有更清楚。但是,当应用于数据帧时,它会迭代计算并且不输出 NA。没关系,我可以每隔一行索引一次,但只是为了让未来的用户知道。
  • 哦,我读它是因为您希望将差异按其他列分组。如果只想计算奇数行,可以使用if (row_number() %% 2 == 1) ... else NA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 2013-12-02
相关资源
最近更新 更多