如何通过重复分类数据来创建新的数据框

时间:2019-10-30 16:48:10

标签: r dataframe

我试图通过拉出几列中的计数并重复该列变量计数的次数及其对应的值来创建新的数据框。

这是我想做的事的一个例子。

dfex=data.frame(group=c(1,2,3),white=c(5,2,1),black=c(1,3,2),num=c(1,5,10))
head(dfex)
  group white black num
1     1     5     1   1
2     2     2     3   5
3     3     1     2  10

我想要得到的是一个具有三列的数据框,分别是bg,颜色(黑色或白色),然后是浓色。 基本上是这样的

   group color num
1      1 white   1
2      1 white   1
3      1 white   1
4      1 white   1
5      1 white   1
6      1 black   1
7      2 white   5
8      2 white   5
9      2 black   5
10     2 black   5
11     2 black   5
12     3 white  10
13     3 black  10
14     3 black  10

我不确定我是否可以用语言很好地解释它,但是我希望该示例具有足够的描述性以解释我希望做的事情。

3 个答案:

答案 0 :(得分:1)

这是一个tidyverse - reshape2解决方案:

library(reshape2)
library(tidyverse)
melt(dfex, id = c("group", "num")) %>% uncount(value) %>% arrange(group) %>%
        select(group, color = variable, num)
# output
   group color num
1      1 white   1
2      1 white   1
3      1 white   1
4      1 white   1
5      1 white   1
6      1 black   1
7      2 white   5
8      2 white   5
9      2 black   5
10     2 black   5
11     2 black   5
12     3 white  10
13     3 black  10
14     3 black  10

答案 1 :(得分:0)

这是一种可能的解决方案:

library(tidyverse)
library(splitstackshape)

dfex %>%
  pivot_longer(cols = c(white, black), names_to = "color") %>%
  expandRows("value")

答案 2 :(得分:0)

你可以做

library(tidyr)
library(dplyr)

gather(dfex, color, reps, -group, - num) %>% 
  rowwise() %>% 
  mutate(new = toString(rep(num, reps))) %>% 
  separate_rows(new, sep = ", ") %>% 
  select(group, color, num = new)

使用@nghauran提出的uncount,它要短得多:

gather(dfex, color, reps, -group, - num) %>% 
  uncount(reps) %>% 
  select(group, num, color)