Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将数据帧拆分为列表中的多个数据帧,每列分别_R_List_For Loop_Dplyr_Split - Fatal编程技术网

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))