首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用R获得同一数据列中值之间的成对差

如何用R获得同一数据列中值之间的成对差
EN

Stack Overflow用户
提问于 2020-09-10 09:35:01
回答 2查看 32关注 0票数 0

我有以下数据:

代码语言:javascript
复制
<!-- language-all: lang-r -->


    library(reprex)
    set.seed(1)
    Data <- data.frame(
      Y = c(rep("v1",3), rep("v2", 3)),
      X = sample(1:6)
    )
    Data
    #>    Y X
    #> 1 v1 1
    #> 2 v1 4
    #> 3 v1 3
    #> 4 v2 6
    #> 5 v2 2
    #> 6 v2 5

<sup>Created on 2020-09-10 by the [reprex package](https://reprex.tidyverse.org) (v0.3.0)</sup>

我想得到v1和v2之间的成对差: 1-6,4-2,3-5。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-10 09:41:01

一个基本的R选项将是基于split列的X数据,并得到两个列表之间的差异。

代码语言:javascript
复制
do.call(mapply, c(split(Data$X, Data$Y), FUN = `-`))
#[1] -5  2 -2

如果我们按步骤分解,可能更容易做到:

代码语言:javascript
复制
tmp <- split(Data$X, Data$Y)
tmp[[1]] - tmp[[2]]
#[1] -5  2 -2

tidyverse解决方案是以宽格式获取数据并减去列。

代码语言:javascript
复制
library(dplyr)

Data %>%
  group_by(Y) %>%
  mutate(row = row_number()) %>%
  tidyr::pivot_wider(names_from = Y, values_from = X) %>%
  mutate(out = v1 -  v2)

# A tibble: 3 x 4
#    row    v1    v2   out
#  <int> <int> <int> <int>
#1     1     1     6    -5
#2     2     4     2     2
#3     3     3     5    -2
票数 2
EN

Stack Overflow用户

发布于 2020-09-10 09:46:20

Tidyverse溶液需要对表进行枢轴以查找差异:

代码语言:javascript
复制
library(tidyverse)
Data %>%
    group_by(Y) %>%
    mutate(id = 1:n()) %>%
    pivot_wider(id_cols = id, names_from = Y, values_from = X) %>%
    mutate(diff = v1 - v2)
#> # A tibble: 3 x 4
#>      id    v1    v2  diff
#>   <int> <int> <int> <int>
#> 1     1     1     6    -5
#> 2     2     4     2     2
#> 3     3     3     5    -2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63826858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档