将多对列合并为每对一列的快速方法

问题描述 投票:0回答:1

在 R 中,我尝试组合列对,以便找到列对之间的最大值。

我的数据框的结构如下:

df <- data.frame(id = c("u1", "u1", "u2", "u2"),
                 visit = c("v1", "v2", "v1", "v2"),
                 a1 = c(1, 3, 5, 7),
                 b1 = c(11, 31, 51, 71),
                 a2 = c(2, 4, 6, 8),
                 b2 = c(21, 41, 61, 81))

每个 ID 都有两次访问,他们执行了两组相同的测试和两组不同的测试。我的想法是我可以像这样组合列(顺序无关紧要):

data.frame(id = c("u1", "u1", "u2", "u2", "u1", "u1", "u2", "u2"),
                 visit = c("v1", "v2", "v1", "v2", "v1", "v2", "v1", "v2"),
                 a = c(1, 3, 5, 7, 2, 4, 6, 8),
                 b = c(11, 31, 51, 71, 21, 41, 61, 81))

从那里我可以使用 group_by 找到每次访问的每个 id 的最大值,并根据最大值进行成对 t 检验。

这是我尝试用来将成对的列组合成列的代码。

df_long <- df %>%
  pivot_longer(cols = starts_with("a"), 
               names_to = c("variable"), 
               values_to = "a") %>%
  pivot_longer(cols = starts_with("b"), 
               names_to = "variable2", 
               values_to = "b") %>%
  select(id, visit, a, b)

pivot_longer
可以很好地组合两列(即,例如仅使用a进行列),但是当我尝试上述操作时,每个值都会显示两次,如果我添加另一个pivot_longer,则每个值都会显示三次。 我知道我可以一次做一个测试,但这会花费相当多的时间,因为我有大量的测试,而且我认为必须有更好的方法来做到这一点。

r dplyr tidyr
1个回答
0
投票

带有

reshape

的基本 R 选项
reshape(
  df,
  direction = "long",
  idvar = c("id", "visit"),
  varying = -(1:2),
  v.names = c("a", "b"),
  timevar = "group"
)

给予

        id visit group a  b
u1.v1.1 u1    v1     1 1 11
u1.v2.1 u1    v2     1 3 31
u2.v1.1 u2    v1     1 5 51
u2.v2.1 u2    v2     1 7 71
u1.v1.2 u1    v1     2 2 21
u1.v2.2 u1    v2     2 4 41
u2.v1.2 u2    v1     2 6 61
u2.v2.2 u2    v2     2 8 81
© www.soinside.com 2019 - 2024. All rights reserved.