使用 ID 变量对将数据帧从“宽”格式转换为“长”格式

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

这是我正在尝试做的一个例子。我从“宽”格式的数据框开始,如下所示。

#sample dataframe
id_1 <- c(260, 500, 640, 720)
id_2 <- c(261, 501, 641, 721)
sleep_1 <- c(7, 3, 10, 6)
sleep_2 <- c(8, 9, 1, 4)
eat_1 <- c(6,8,4,2)
eat_2 <- c(8,1,3,8)
df <- data.frame(id_1, id_2, sleep_1, sleep_2, eat_1, eat_2)

> df
  id_1 id_2 sleep_1 sleep_2 eat_1 eat_2
1  260  261       7       8     6     8
2  500  501       3       9     8     1
3  640  641      10       1     4     3
4  720  721       6       4     2     8
5  801   NA       8      NA     5    NA
6  440  441       4       9     3     6

我们可以将 id_1 和 id_2 视为表示一对兄弟姐妹,其中 260、261 是一对,500、501 是一对等。我想将此数据帧转换为“长”格式,如下所示。这样做时,我还希望能够处理仅存在该对中的一个成员(例如 801)并且相应的兄弟姐妹为 NA 的情况(如上所示)。

    id sleep eat
1  260     7   6
2  261     8   8
3  500     3   8
4  501     9   1
5  640    10   4
6  641     1   3
7  720     6   2
8  721     4   8
9  801     8   5
10 440     4   3
11 441     9   6
r dataframe reshape long-format-data wide-format-data
1个回答
0
投票

此代码可能可以解决您的问题:

library(tidyverse)
id1 <- df %>% 
  select(ends_with("1"))
colnames(id1) <- c("id", "sleep", "eat")

id2 <- df %>% 
  select(ends_with("2"))
colnames(id2) <- c("id", "sleep", "eat")

df <- id1 %>% bind_rows(id2)
df
   id sleep eat
1 260     7   6
2 500     3   8
3 640    10   4
4 720     6   2
5 261     8   8
6 501     9   1
7 641     1   3
8 721     4   8
© www.soinside.com 2019 - 2024. All rights reserved.