r - 将数据框拆分为列表中的多个数据框,每列分别

标签 r list for-loop dplyr split

我有一个数据框 df,其第一列是字符向量,其余列是数字。

示例数据框:

df <- data.frame(my_names=sample(LETTERS,4,replace=F),
                 column2=sample(1.3:100.3,4,replace=T),
                 column3=sample(1.3:100.3,4,replace=T),
                 column4=sample(1.3:100.3,4,replace=T),
                 column5=sample(1.3:100.3,4,replace=T))
> df
  my_names column2 column3 column4 column5
1        A     8.3     1.3    19.3    91.3
2        E    18.3    42.3     8.3    76.3
3        O     6.3    46.3    26.3    91.3
4        M    73.3     6.3    59.3    93.3

现在我想像这样创建 4 个不同的数据框:

  • d1:my_names & column2
  • d2:我的名字和第 3 列
  • d3:my_names & column4
  • d4:我的名字和第 5 列

并将它们存储到一个列表中。 d1 看起来像:

> d1
  my_names column2
1        A     8.3
2        E    18.3
3        O     6.3
4        M    73.3

我试过:

>the_list <- vector("list",ncol(df)-1)
> for(i in 1:length(the_list)){ for(j in 2:ncol(df)){
+   the_list[[i]] <- select(df, my_names,j)
+ }
+ }
Note: Using an external vector in selections is ambiguous.
ℹ Use `all_of(j)` instead of `j` to silence this message.

但我得到一个列表,其中所有数据框都带有 column5:

    > str(the_list)
List of 4
 $ :'data.frame':   4 obs. of  2 variables:
  ..$ my_names: chr [1:4] "A" "E" "O" "M"
  ..$ column5 : num [1:4] 91.3 76.3 91.3 93.3
 $ :'data.frame':   4 obs. of  2 variables:
  ..$ my_names: chr [1:4] "A" "E" "O" "M"
  ..$ column5 : num [1:4] 91.3 76.3 91.3 93.3
 $ :'data.frame':   4 obs. of  2 variables:
  ..$ my_names: chr [1:4] "A" "E" "O" "M"
  ..$ column5 : num [1:4] 91.3 76.3 91.3 93.3
 $ :'data.frame':   4 obs. of  2 variables:
  ..$ my_names: chr [1:4] "A" "E" "O" "M"
  ..$ column5 : num [1:4] 91.3 76.3 91.3 93.3

我从错误中提取建议(使用 all_of(j))并写成:

> for(i in 1:length(the_list)){ 
  for(j in 2:ncol(df)){
    the_list[[i]] <- select(df, my_names,all_of(j))
  }
  }

但是结果和上面一样。

我读到过可以使用 split,但我没有什么可以分组的依据,它是单独的每一列。 例如,这不起作用:

new_list<-list(split(df, colnames(df))

我得到一个 1 的 wired 列表。

最佳答案

试试这个 tidyverse 方法。您可以将数据格式化为 long 以将列转换为行。然后,使用 split(),您可以根据列名创建一个列表。最后,您可以应用一个函数将列表中每个数据帧的数据转换为宽数据并达到所需的输出。这里的代码:

library(tidyverse)
#Data
df <- data.frame(my_names=sample(LETTERS,4,replace=F),
                 column2=sample(1.3:100.3,4,replace=T),
                 column3=sample(1.3:100.3,4,replace=T),
                 column4=sample(1.3:100.3,4,replace=T),
                 column5=sample(1.3:100.3,4,replace=T))
#Reshape to long
df2 <- df %>% pivot_longer(cols = -1)
#Split into a list
List <- split(df2,df2$name)
#Now reshape function for wide format
List2 <- lapply(List,function(x){x<-pivot_wider(x,names_from = name,values_from = value);return(x)})
names(List2) <- paste0('df',1:length(List2))

输出:

List2
$df1
# A tibble: 4 x 2
  my_names column2
  <fct>      <dbl>
1 N           21.3
2 H           35.3
3 X           42.3
4 U           89.3

$df2
# A tibble: 4 x 2
  my_names column3
  <fct>      <dbl>
1 N           94.3
2 H           54.3
3 X            2.3
4 U           38.3

$df3
# A tibble: 4 x 2
  my_names column4
  <fct>      <dbl>
1 N           75.3
2 H           94.3
3 X           87.3
4 U          100. 

$df4
# A tibble: 4 x 2
  my_names column5
  <fct>      <dbl>
1 N           60.3
2 H           88.3
3 X           14.3
4 U           99.3

关于r - 将数据框拆分为列表中的多个数据框,每列分别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63830043/

相关文章:

r - R Markdown 中的 Leaflet() 之后的 d3heatmap() 导致 addLegend() 消失

r - 指示最大值并在 ggplot 上添加相应的标签

list - Netlogo:给定嵌套列表的元素,检索嵌套列表的位置

python - 将txt文件转换为列表并在用户输入搜索后返回行

c - 当 for 循环中有逗号而不是分号时,没有编译器警告

R:如何舍入plot.nn()中的权重数字?

R/ImageJ : Measuring shortest distance between points and curves

python - 将列表字符串列表转换为Python中的日期以进行时间序列建模 -

Java程序打印N以内的所有奇数,每行打印10个整数

javascript - 在javascript中循环和存储不同长度的obj