如何将数据框转换为所需的结构和形式?
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
我的数据是 .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