如何转置 R 中分组数据中的列?
How to tranpose columns in a grouped data in R?
我有一个按 CompanyID(2 家公司)分组的数据框 (df),并且有按年份(2006 年和 2007 年)分类的信息。
df <-
CompanyID Name Country ISIN Director2006 Gender2006 F2006 M2006 Findex2006 Fperce2006 Total2006 Blauindex2006 Director2007 Gender2007 F2007 M2007 Total2007 Findex2007 Blauindex2007 Fperce2007
25830 BANKxxx Austria AT000504 11734844255 M 2 3 1 0.4 5 0.48 11734844255 M 1 4 5 1 0.32 0.2
25830 BANKxxx Austria AT000504 1878371165 F NA NA NA NA NA NA 5524344997 F NA NA NA NA NA NA
25830 BANKxxx Austria AT000504 5524344997 F NA NA NA NA NA NA 5524354997 M NA NA NA NA NA NA
25830 BANKxxx Austria AT000504 5524354997 M NA NA NA NA NA NA 5742347684 M NA NA NA NA NA NA
25830 BANKxxx Austria AT000504 6613115791 M NA NA NA NA NA NA 40160443378 M NA NA NA NA NA NA
12339 BANKyyy Belgium AT034003 5524344997 M 0 2 0 0 2 0 5524344997 M 0 2 2 0 0 0
12339 BANKyyy Belgium AT034003 5524354997 M NA NA NA NA NA NA 5524354997 M NA NA NA NA NA NA
我想转置 2006 年和 2007 年的某些列(Findex、Fperce、Blauindex 和 Total)。
因此,我的预期输出如下:
df_final <-
Name CompanyID ISIN Country Year Findex Fperce Blauindex Total
BANKxxx 25830 AT000504 Austria 2006 1 0.4 0.48 5
2007 1 0.2 0.32 5
BANKyyy 12339 AT034003 Belgium 2006 0 0 0 2
2007 0 0 0 2
拜托,有人可以告诉我吗?谢谢
数据
df <- read.table(text =
"CompanyID Name Country ISIN Director2006 Gender2006 F2006 M2006 Findex2006 Fperce2006 Total2006 Blauindex2006 Director2007 Gender2007 F2007 M2007 Total2007 Findex2007 Blauindex2007 Fperce2007
25830 BANKxxx Austria AT000504 11734844255 M 2 3 1 0.4 5 0.48 11734844255 M 1 4 5 1 0.32 0.2
25830 BANKxxx Austria AT000504 1878371165 F NA NA NA NA NA NA 5524344997 F NA NA NA NA NA NA
25830 BANKxxx Austria AT000504 5524344997 F NA NA NA NA NA NA 5524354997 M NA NA NA NA NA NA
25830 BANKxxx Austria AT000504 5524354997 M NA NA NA NA NA NA 5742347684 M NA NA NA NA NA NA
25830 BANKxxx Austria AT000504 6613115791 M NA NA NA NA NA NA 40160443378 M NA NA NA NA NA NA
12339 BANKyyy Belgium AT034003 5524344997 M 0 2 0 0 2 0 5524344997 M 0 2 2 0 0 0
12339 BANKyyy Belgium AT034003 5524354997 M NA NA NA NA NA NA 5524354997 M NA NA NA NA NA NA",
header = T, stringsAsFactors = F)
这是一个基于 dplyr
/tidyr
的工作流程。我正在选择您感兴趣的列,使用 matches
提供正则表达式来匹配列名,以节省必须写出“Findex2006”、“Findex2007”等的麻烦。如果您最终得到不仅仅是这两年一起工作。然后我将数据收集成一个长格式,不包括 CompanyID
到 ISIN
。然后 separate
和 sep = -4
将 measure
(例如“Findex2006”)分成两列,其中第二列的值从每个字符串末尾的 4 个字符开始(例如“Findex”和“2006”)。我过滤掉了其中的一些 NA
,然后 spread
将其恢复为宽形状,但列不再基于年份。
library(tidyr)
library(dplyr)
df %>%
select("CompanyID", "Name", "Country", "ISIN", matches("Findex|Fperce|Blauindex|Total")) %>%
gather(key = measure, value = value, -CompanyID:-ISIN) %>%
separate(measure, into = c("measure", "Year"), sep = -4) %>%
filter(!is.na(value)) %>%
spread(key = measure, value = value)
#> CompanyID Name Country ISIN Year Blauindex Findex Fperce Total
#> 1 12339 BANKyyy Belgium AT034003 2006 0.00 0 0.0 2
#> 2 12339 BANKyyy Belgium AT034003 2007 0.00 0 0.0 2
#> 3 25830 BANKxxx Austria AT000504 2006 0.48 1 0.4 5
#> 4 25830 BANKxxx Austria AT000504 2007 0.32 1 0.2 5
已针对 tidyr
v1.0.0 更新: pivot
函数使此处的语法更清晰,允许拆分名称作为重塑的一部分。
df %>%
dplyr::filter(!is.na(F2006)) %>%
pivot_longer(-CompanyID:-ISIN, names_to = c(".value", "Year"),
names_pattern = "(^[A-Za-z]+)(\d{4}$)") %>%
dplyr::select(-Gender:-M)
我有一个按 CompanyID(2 家公司)分组的数据框 (df),并且有按年份(2006 年和 2007 年)分类的信息。
df <-
CompanyID Name Country ISIN Director2006 Gender2006 F2006 M2006 Findex2006 Fperce2006 Total2006 Blauindex2006 Director2007 Gender2007 F2007 M2007 Total2007 Findex2007 Blauindex2007 Fperce2007
25830 BANKxxx Austria AT000504 11734844255 M 2 3 1 0.4 5 0.48 11734844255 M 1 4 5 1 0.32 0.2
25830 BANKxxx Austria AT000504 1878371165 F NA NA NA NA NA NA 5524344997 F NA NA NA NA NA NA
25830 BANKxxx Austria AT000504 5524344997 F NA NA NA NA NA NA 5524354997 M NA NA NA NA NA NA
25830 BANKxxx Austria AT000504 5524354997 M NA NA NA NA NA NA 5742347684 M NA NA NA NA NA NA
25830 BANKxxx Austria AT000504 6613115791 M NA NA NA NA NA NA 40160443378 M NA NA NA NA NA NA
12339 BANKyyy Belgium AT034003 5524344997 M 0 2 0 0 2 0 5524344997 M 0 2 2 0 0 0
12339 BANKyyy Belgium AT034003 5524354997 M NA NA NA NA NA NA 5524354997 M NA NA NA NA NA NA
我想转置 2006 年和 2007 年的某些列(Findex、Fperce、Blauindex 和 Total)。
因此,我的预期输出如下:
df_final <-
Name CompanyID ISIN Country Year Findex Fperce Blauindex Total
BANKxxx 25830 AT000504 Austria 2006 1 0.4 0.48 5
2007 1 0.2 0.32 5
BANKyyy 12339 AT034003 Belgium 2006 0 0 0 2
2007 0 0 0 2
拜托,有人可以告诉我吗?谢谢
数据
df <- read.table(text =
"CompanyID Name Country ISIN Director2006 Gender2006 F2006 M2006 Findex2006 Fperce2006 Total2006 Blauindex2006 Director2007 Gender2007 F2007 M2007 Total2007 Findex2007 Blauindex2007 Fperce2007
25830 BANKxxx Austria AT000504 11734844255 M 2 3 1 0.4 5 0.48 11734844255 M 1 4 5 1 0.32 0.2
25830 BANKxxx Austria AT000504 1878371165 F NA NA NA NA NA NA 5524344997 F NA NA NA NA NA NA
25830 BANKxxx Austria AT000504 5524344997 F NA NA NA NA NA NA 5524354997 M NA NA NA NA NA NA
25830 BANKxxx Austria AT000504 5524354997 M NA NA NA NA NA NA 5742347684 M NA NA NA NA NA NA
25830 BANKxxx Austria AT000504 6613115791 M NA NA NA NA NA NA 40160443378 M NA NA NA NA NA NA
12339 BANKyyy Belgium AT034003 5524344997 M 0 2 0 0 2 0 5524344997 M 0 2 2 0 0 0
12339 BANKyyy Belgium AT034003 5524354997 M NA NA NA NA NA NA 5524354997 M NA NA NA NA NA NA",
header = T, stringsAsFactors = F)
这是一个基于 dplyr
/tidyr
的工作流程。我正在选择您感兴趣的列,使用 matches
提供正则表达式来匹配列名,以节省必须写出“Findex2006”、“Findex2007”等的麻烦。如果您最终得到不仅仅是这两年一起工作。然后我将数据收集成一个长格式,不包括 CompanyID
到 ISIN
。然后 separate
和 sep = -4
将 measure
(例如“Findex2006”)分成两列,其中第二列的值从每个字符串末尾的 4 个字符开始(例如“Findex”和“2006”)。我过滤掉了其中的一些 NA
,然后 spread
将其恢复为宽形状,但列不再基于年份。
library(tidyr)
library(dplyr)
df %>%
select("CompanyID", "Name", "Country", "ISIN", matches("Findex|Fperce|Blauindex|Total")) %>%
gather(key = measure, value = value, -CompanyID:-ISIN) %>%
separate(measure, into = c("measure", "Year"), sep = -4) %>%
filter(!is.na(value)) %>%
spread(key = measure, value = value)
#> CompanyID Name Country ISIN Year Blauindex Findex Fperce Total
#> 1 12339 BANKyyy Belgium AT034003 2006 0.00 0 0.0 2
#> 2 12339 BANKyyy Belgium AT034003 2007 0.00 0 0.0 2
#> 3 25830 BANKxxx Austria AT000504 2006 0.48 1 0.4 5
#> 4 25830 BANKxxx Austria AT000504 2007 0.32 1 0.2 5
已针对 tidyr
v1.0.0 更新: pivot
函数使此处的语法更清晰,允许拆分名称作为重塑的一部分。
df %>%
dplyr::filter(!is.na(F2006)) %>%
pivot_longer(-CompanyID:-ISIN, names_to = c(".value", "Year"),
names_pattern = "(^[A-Za-z]+)(\d{4}$)") %>%
dplyr::select(-Gender:-M)