我有以下数据:
<!-- 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。
发布于 2020-09-10 09:41:01
一个基本的R选项将是基于split列的X数据,并得到两个列表之间的差异。
do.call(mapply, c(split(Data$X, Data$Y), FUN = `-`))
#[1] -5 2 -2如果我们按步骤分解,可能更容易做到:
tmp <- split(Data$X, Data$Y)
tmp[[1]] - tmp[[2]]
#[1] -5 2 -2tidyverse解决方案是以宽格式获取数据并减去列。
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发布于 2020-09-10 09:46:20
Tidyverse溶液需要对表进行枢轴以查找差异:
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 -2https://stackoverflow.com/questions/63826858
复制相似问题