我的数据看起来就像
df <- data.frame(Role = c("a","a","b", "b", "c", "c"), Men = c(1,0,3,1,2,4), Women = c(2,1,1,4,3,1))
df.melt <- melt(df)我只能访问看起来像df.melt的版本,如何在df表单中获得它?
使用dcast只会给我带来错误,我无法理解它的语法。
发布于 2020-09-20 20:41:38
我们需要一个序列列来指定行,因为melt‘变量中有重复的行
library(tidyr)
library(dplyr)
library(data.table)
df.melt %>%
mutate(rn = rowid(variable)) %>%
pivot_wider(names_from = variable, values_from = value) %>%
select(-rn)
# A tibble: 6 x 3
# Role Men Women
# <chr> <dbl> <dbl>
#1 a 1 2
#2 a 0 1
#3 b 3 1
#4 b 1 4
#5 c 2 3
#6 c 4 1如果我们正在寻找“最佳”方式的有效途径,来自data.table的data.table是快速的。
library(data.table)
dcast(setDT(df.melt), rowid(variable) + Role ~
variable, value.var = 'value')[, variable := NULL][]
# Role Men Women
#1: a 1 2
#2: a 0 1
#3: b 3 1
#4: b 1 4
#5: c 2 3
#6: c 4 1发布于 2020-09-20 20:58:43
下面是使用unstack的基本R选项
cbind(
Role = df.melt[1:(nrow(df.melt) / length(unique(df.melt$variable))), 1],
unstack(rev(df.melt[-1]))
)这给
Role Men Women
1 a 1 2
2 a 0 1
3 b 3 1
4 b 1 4
5 c 2 3
6 c 4 1另一种选择是使用reshape
subset(
reshape(
transform(
df.melt,
id = ave(1:nrow(df.melt), Role, variable, FUN = seq_along)
),
direction = "wide",
idvar = c("Role", "id"),
timevar = "variable"
),
select = -id
)这给
Role value.Men value.Women
1 a 1 2
2 a 0 1
3 b 3 1
4 b 1 4
5 c 2 3
6 c 4 1https://stackoverflow.com/questions/63983434
复制相似问题