R 将数据帧拆分为列表中的多个数据帧,每列分别
我有一个数据帧R 将数据帧拆分为列表中的多个数据帧,每列分别,r,list,for-loop,dplyr,split,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,re
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
我试过:
>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.
我从错误中得到建议(使用(j)中的所有_)并写下:
> for(i in 1:length(the_list)){
for(j in 2:ncol(df)){
the_list[[i]] <- select(df, my_names,all_of(j))
}
}
我得到一个1的wird列表。试试这个
tidyverse
方法。您可以将数据格式化为长格式,以便将列转换为行。然后,使用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))
库(tidyverse)
#资料
df也许你可以试试list2env
list2env(
setNames(
lapply(seq_along(df)[-1], function(k) cbind(df[c(1, k)])),
paste0("d", seq_along(df[-1]))
),
envir = .GlobalEnv
)
如果只需要数据帧列表,可以删除list2env
,即
setNames(
lapply(seq_along(df)[-1], function(k) cbind(df[c(1, k)])),
paste0("d", seq_along(df[-1]))
)
给
$d1
my_names column2
1 C 45.3
2 M 89.3
3 G 35.3
4 T 48.3
$d2
my_names column3
1 C 41.3
2 M 56.3
3 G 34.3
4 T 95.3
$d3
my_names column4
1 C 78.3
2 M 7.3
3 G 60.3
4 T 19.3
$d4
my_names column5
1 C 76.3
2 M 51.3
3 G 96.3
4 T 96.3
使用lappy
:
data <- lapply(seq_along(df[-1]), function(x) cbind(df[1], df[x+1]))
带有lappy()
的base
解决方案
或
之后,您可以使用setNames()
为列表分配名称。使用purr
和dplyr
的一个选项可以是:
map(2:length(df),
~ df %>%
select(1, all_of(.x)))
[[1]]
my_names column2
1 N 21.3
2 S 91.3
3 T 50.3
4 F 34.3
[[2]]
my_names column3
1 N 84.3
2 S 20.3
3 T 1.3
4 F 61.3
[[3]]
my_names column4
1 N 4.3
2 S 9.3
3 T 93.3
4 F 58.3
[[4]]
my_names column5
1 N 33.3
2 S 61.3
3 T 12.3
4 F 91.3
如果您对命名列表感兴趣:
set_names(map(2:length(df),
~ df %>%
select(1, all_of(.x))),
paste0("df", 2:length(df) - 1))
非常感谢。
$d1
my_names column2
1 C 45.3
2 M 89.3
3 G 35.3
4 T 48.3
$d2
my_names column3
1 C 41.3
2 M 56.3
3 G 34.3
4 T 95.3
$d3
my_names column4
1 C 78.3
2 M 7.3
3 G 60.3
4 T 19.3
$d4
my_names column5
1 C 76.3
2 M 51.3
3 G 96.3
4 T 96.3
data <- lapply(seq_along(df[-1]), function(x) cbind(df[1], df[x+1]))
names(data) <- paste0('d', seq_along(data))
list2env(data, .GlobalEnv)
lapply(seq_along(df)[-1], function(x) df[c(1, x)])
lapply(names(df)[-1], function(x) df[c("my_names", x)])
map(2:length(df),
~ df %>%
select(1, all_of(.x)))
[[1]]
my_names column2
1 N 21.3
2 S 91.3
3 T 50.3
4 F 34.3
[[2]]
my_names column3
1 N 84.3
2 S 20.3
3 T 1.3
4 F 61.3
[[3]]
my_names column4
1 N 4.3
2 S 9.3
3 T 93.3
4 F 58.3
[[4]]
my_names column5
1 N 33.3
2 S 61.3
3 T 12.3
4 F 91.3
set_names(map(2:length(df),
~ df %>%
select(1, all_of(.x))),
paste0("df", 2:length(df) - 1))