R中如何根据指定的列名将数据框分成不同的组?

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

我有一个包含 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]
}

r dataframe split multiple-columns
2个回答
0
投票

这里有一个方法可以做到这一点

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

我们映射唯一的名称并将它们子集化并将它们组合在一起。


0
投票

使用

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