【问题标题】:How to expand dataframe based on two columns?如何基于两列扩展数据框?
【发布时间】:2022-01-03 15:18:13
【问题描述】:

我不确定如何解决以下问题。我有一个如下所示的数据框:

df <- structure(list(category = c(1, 2, 3, 4, 5), f1 = c(2, 3, 2, 3, 1), 
           f2 = c(1, 2, 4 ,1, 2)),  row.names = c(NA, -5L),
           class = c("tbl_df", "tbl", "data.frame"))

变量中的数字(名为“类别”的变量除外)表示属于这些类别之一的受试者,f1 和 f2 是分为这两个变量的变量。我想“融化”它们,例如 f1 变量中的那些 2 将成为名为“f”的变量中的 2 行,它们将具有数字 1,同时保持它们旁边的类别,在这种情况下为 1。 F2,类别 1 有 1 个观察值,将再次成为变量“f”和类别 1 中的 1 行,但这次它的编号为 2。

因此,f1 将始终生成在“f”列中为 1 的行,而 f2 将在“f”列中生成始终为“2”的行。

下面是我想要实现的视觉示例:

      category    f 
    1     1       1
    2     1       1
    3     1       2
    4     2       1       
    5     2       1
    6     2       1
    7     2       2      
    8     2       2
    9     3       1
   10     3       1
   11     3       2
   12     3       2
   13     3       2
   14     3       2

提前谢谢你。

【问题讨论】:

  • 如果他们充分回答了您的问题,您可能希望接受其中一个答案。

标签: r dataframe dplyr pivot-table melt


【解决方案1】:

这是tidyr::uncount 的完美任务:

library(tidyr)
df %>% 
  pivot_longer(cols= c("f1", "f2"), names_to = "f", names_transform = list(f = seq)) %>% 
  uncount(value)

输出:

df
   category f
1         1 1
2         1 1
3         1 2
4         2 1
5         2 1
6         2 1
7         2 2
8         2 2
9         3 1
10        3 1
11        3 2
12        3 2
13        3 2
14        3 2
15        4 1
16        4 1
17        4 1
18        4 2
19        5 1
20        5 2
21        5 2

【讨论】:

  • 我不知道tidyr::uncount,这个很有用。
【解决方案2】:
df %>% 
  pivot_longer(cols=c("f1", "f2")) %>% 
  mutate(name=replace(name, name=="f1", 1)) %>%
  mutate(name=replace(name, name=="f2", 2)) %>%
  group_by(category,name,value) %>%
  expand(value=seq(1:value)) %>%
  rename(f=name) %>%
  as.data.frame() %>%
  select(-value)

    category f
1         1 1
2         1 1
3         1 2
4         2 1
5         2 1
6         2 1
7         2 2
8         2 2
9         3 1
10        3 1
11        3 2
12        3 2
13        3 2
14        3 2
15        4 1
16        4 1
17        4 1
18        4 2
19        5 1
20        5 2
21        5 2

【讨论】:

  • 谢谢 :) 这正是我想要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 2018-01-13
  • 2018-01-30
相关资源
最近更新 更多