R中的导入交叉表

问题描述 投票:0回答:2

我正在尝试将交叉表导入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值。

r long-integer
2个回答
0
投票

使用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

0
投票

您可以使用outer在行和列的所有排列上应用VectorizedFUNction。

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
© www.soinside.com 2019 - 2024. All rights reserved.