如何将数据框转换为所需的结构和形式?

How do I transform a data frame to the desired structure and form?

我的数据是 .xlsx 数据透视表 table。那里有几个 sheet,但我只需要一个来进行分析。在这个 sheet 我有一个看起来像这样的数据框

df <- data.frame(ind = c("ind1", "ind1", "ind1", "ind1", 
                         "ind2", "ind2", "ind2", "ind2",
                         "ind3", "ind3", "ind3", "ind3",
                         "ind4", "ind4", "ind4", "ind4"),
                 shr = c(-0.23, 0, 0.12, 0.68,
                         -0.54, 0.80, 0.14, -0.23,
                          0.48, 0.94, -0.01, 0.31,
                          0.18, 0.11, 0.98, 0.05))

以及具有不同数据类型的其他列。我不需要它们,我在示例中只需要这两个。所以,df 是:

df
#    ind   shr
#1  ind1 -0.23
#2  ind1  0.00
#3  ind1  0.12
#4  ind1  0.68
#5  ind2 -0.54
#6  ind2  0.80
#7  ind2  0.14
#8  ind2 -0.23
#9  ind3  0.48
#10 ind3  0.94
#11 ind3 -0.01
#12 ind3  0.31
#13 ind4  0.18
#14 ind4  0.11
#15 ind4  0.98
#16 ind4  0.05

我需要将此数据框转换为以下形式:

df
#      shr
# ind1 -0.23 0.00 0.12 0.68
# ind2 -0.54 0.80 0.14 -0.23
# ind3 .....
# ind4 .....

或者,如果我的数据看起来像这样也很方便:

df
# ind1   ind2   ind3   ind4
# -0.23   .      .
#  0.00   .      .
#  0.12   .      .
#  0.68   .      .

简而言之,我想让我的数据紧凑和舒适table以便进一步分析。主要的困难是我的初始数据文件是 .xlsx 具有不同的 sheet 和 pivot table.

(1) 如何从包含多个 sheet 的 .xlsx 文件中提取数据? (2) 如何获得理想的 df 结构?

您可以使用以下代码:

list1<-c(1:4)
df$col<-1:nrow(df)
df$remainder<-df$col%%4
df$col<-NULL

dcast(df,ind~remainder, value.var = "shr" )

>   ind     0     1    2     3
1 ind1  0.68 -0.23 0.00  0.12
2 ind2 -0.23 -0.54 0.80  0.14
3 ind3  0.31  0.48 0.94 -0.01
4 ind4  0.05  0.18 0.11  0.98

dcast(df,remainder~ind, value.var = "shr" )

>  remainder  ind1  ind2  ind3 ind4
1         0  0.68 -0.23  0.31 0.05
2         1 -0.23 -0.54  0.48 0.18
3         2  0.00  0.80  0.94 0.11
4         3  0.12  0.14 -0.01 0.98

以下是转换数据的方法。 tidyr 中的 pivot_wider 需要 ID 列。在这里,我使用 mutate(row = row_number()) 创建了一个。要从 excel 读取数据,我建议使用 readxl 包。 read_xlsx 函数允许您指定 excel sheet 和范围。

library(dplyr)
df %>%
  group_by(ind) %>%
  mutate(row = row_number()) %>%
  pivot_wider(names_from= ind, values_from = shr) %>%
  select(-row)

# A tibble: 4 x 4
   ind1  ind2  ind3  ind4
  <dbl> <dbl> <dbl> <dbl>
1 -0.23 -0.54  0.48  0.18
2  0     0.8   0.94  0.11
3  0.12  0.14 -0.01  0.98
4  0.68 -0.23  0.31  0.05