我正在尝试将交叉表导入R以使用。该表如下所示:
df <- data.frame(`0` = c(.1, .2, .3),
`15` = c(70, 70, 71),
`30` = c(71, 72, 75))
或:
0 15 30
.1 70 71
.2 70 72
.3 71 75
我想要编写一段代码以将其转换为以下格式:
df_transformed <- data.frame(x = c(15, 15, 15, 30, 30, 30), y = c(.1, .2, .3, .1, .2, .3), z = c(70, 70, 71, 71, 72, 75)
或:
x y z
15 .1 70
15 .2 70
15 .3 71
30 .1 71
30 .2 72
30 .3 75
通过这种方式,df_transformed
将描述每个带有附加值的组合,就像您要在交叉表(df
)中查找它一样。即:如果df
的列等于15
,而行等于.1
,则对应的值为70
。是否有捷径可寻?我尝试了tidyr::gather()
,但是它无法描述每个唯一的z
值。
使用tidyverse
,您可以做:
library(tidyverse)
df %>%
pivot_longer(cols = c(X15, X30), names_to = c("x"), values_to = "z", names_pattern = "X(\\d+)", names_ptypes = list(x = numeric())) %>%
rename(y = X0) %>%
arrange(x, y) %>%
select(x, y, z)
输出
# A tibble: 6 x 3
x y z
<dbl> <dbl> <dbl>
1 15 0.1 70
2 15 0.2 70
3 15 0.3 71
4 30 0.1 71
5 30 0.2 72
6 30 0.3 75
您可以使用outer
在行和列的所有排列上应用Vectorized
FUN
ction。
FUN <- Vectorize(function(x, y) df[x, y + 1])
res <- data.frame(x=colnames(m), y=rownames(m),
z=as.vector(outer(1:nrow(m), 1:ncol(m), FUN)))
res
# x y z
# 1 X15 0.1 70
# 2 X30 0.2 70
# 3 X15 0.3 71
# 4 X30 0.1 71
# 5 X15 0.2 72
# 6 X30 0.3 75