我想将数据框转换A
为数据框B
A = data.frame(male = c(3, 5), female = c(1,2))
B = data.frame(male = c(1,1,1,1,1,1,1,1,0,0,0), female = c(0,0,0,0,0,0,0,0,1,1,1))
我有这种方法
new <- data.frame(male = c(rep(1, sum(male)), rep(0, sum(female))), female = c(rep(0, sum(male)), rep(1, sum(female))))
这给了我想要的数据帧。
但是,由于我的原始数据帧(A)比示例更复杂,因此有更好的方法吗?
更新
数据帧可能会更复杂,例如
A = data.frame(month = c("July", "August"), male = c(5, 3), female = c(2,1))
转化为
data.frame(month = c(rep("July", 5), rep("July", 2), rep("Aug", 3), rep("Aug", 1)),
male = c(rep(1, 5), rep(0, 2), rep(1, 3), rep(0, 1)),
female = c(rep(0, 5), rep(1, 2), rep(0, 3), rep(1, 1)))
# month male female
#1 July 1 0
#2 July 1 0
#3 July 1 0
#4 July 1 0
#5 July 1 0
#6 July 0 1
#7 July 0 1
#8 August 1 0
#9 August 1 0
#10 August 1 0
#11 August 0 1
谢谢。
我们可以在中执行此操作tidyverse
。gather
将数据转换为“长”格式,然后通过uncount
“ val”列扩展行,创建1列,按“月”分组,创建一个序列列(ind),spread
从“长”到“宽”
library(tidyverse)
gather(A, sex, val, -month) %>%
uncount(val) %>%
mutate(val = 1) %>%
group_by(month = factor(month, levels = month.name)) %>%
mutate(ind = row_number()) %>%
spread(sex, val, fill = 0) %>%
select(month, male, female)
# A tibble: 11 x 3
# Groups: month [2]
# month male female
# <fct> <dbl> <dbl>
# 1 July 1 0
# 2 July 1 0
# 3 July 1 0
# 4 July 1 0
# 5 July 1 0
# 6 July 0 1
# 7 July 0 1
# 8 August 1 0
# 9 August 1 0
#10 August 1 0
#11 August 0 1
或使用类似的逻辑 data.table
library(data.table)
dcast(melt(setDT(A), id.var = 'month')[, rep(1, value),
.(month, variable)], month + rowid(month) ~ variable,
value.var = 'V1', fill = 0)[, month_1 := NULL][]
A <- data.frame(month = c("July", "August"), male = c(5, 3), female = c(2,1))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句