我有一个包含 100 列的大数据,它们各自有四个不同的列名称,我想根据它们的名称将它们分成四个不同的数据框。
我已经在这个问题上挣扎了好几个小时了。这可能是一件微不足道的事情,但我无法弄清楚(我是编码新手)。我期待任何纠正和建议。 非常感谢!
我试图创建一个名为“split_dfs”的数据框列表,并使用 for 循环将元素分配给每个单独的组。我预计“split_dfs”应该包含每组列的单独数据帧。但是, print(split_dfs) 显示 NULL。看起来元素没有成功添加到 list() 中。
我的数据:(示例)
<df>
A B C B D A C C B
0.6 0.1 0.3 0.4 0.2 0.1 0.3 0.9 0.9
0.9 0.81 0.5 0.73 0.3 0.8 0.5 0.8 0.1
0.18 0.7 0.79 0.3 0.5 0.4 0.7 0.4 0.4
预期结果(获得四个独立的数据框,其中包含所有行的值):
<group A>
A
0.6
0.9
0.18
0.1
0.8
0.4
<group B>
B
0.1
0.81
0.7
0.9
0.1
0.4
<group C>
C
0.3
0.5
0.79
0.3
0.5
0.7
0.9
0.8
0.4
<group D>
D
0.2
0.3
0.5
我使用的代码:
col_groups = list(
c("A"),
c("B"),
c("C"),
c("D")
)
split_dfs = list()
for(i in names(col_groups)){
selected_cols = col_groups[[i]]
split_dfs[[i]] = new_df[, selected_cols, drop = FALSE]
}
这里有一个方法可以做到这一点
split_by_col_name <- function(data, cols=unique(names(data))) {
Map(function(x) unname(unlist(data[which(names(data)==x)])), cols)
}
split_by_col_name(df)
# $A
# [1] 0.60 0.90 0.18 0.10 0.80 0.40
# $B
# [1] 0.10 0.81 0.70 0.40 0.73 0.30 0.90 0.10 0.40
# $C
# [1] 0.30 0.50 0.79 0.30 0.50 0.70 0.90 0.80 0.40
# $D
# [1] 0.2 0.3 0.5
我们映射唯一的名称并将它们子集化并将它们组合在一起。
使用
pivot_longer
重塑数据的方法。
注意,不要使用 tidyverse 中的
group_split
,因为它会删除组名称。另外,严格来说,初始数据框是无效的,因为它有重复的名称。
library(tidyr)
split(df |>
pivot_longer(everything()), colnames(df))
$A
# A tibble: 6 × 2
name value
<chr> <dbl>
1 A 0.6
2 A 0.1
3 A 0.9
4 A 0.8
5 A 0.18
6 A 0.4
$B
# A tibble: 9 × 2
name value
<chr> <dbl>
1 B 0.1
2 B 0.4
3 B 0.9
4 B 0.81
5 B 0.73
6 B 0.1
7 B 0.7
8 B 0.3
9 B 0.4
$C
# A tibble: 9 × 2
name value
<chr> <dbl>
1 C 0.3
2 C 0.3
3 C 0.9
4 C 0.5
5 C 0.5
6 C 0.8
7 C 0.79
8 C 0.7
9 C 0.4
$D
# A tibble: 3 × 2
name value
<chr> <dbl>
1 D 0.2
2 D 0.3
3 D 0.5