我试图通过拉出几列中的计数并重复该列变量计数的次数及其对应的值来创建新的数据框。
这是我想做的事的一个例子。
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
我不确定我是否可以用语言很好地解释它,但是我希望该示例具有足够的描述性以解释我希望做的事情。
答案 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)