我有一个数据框 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/