【问题标题】:How to convert a large dataframe based on columns into a list of dataframes in R如何将基于列的大型数据框转换为 R 中的数据框列表
【发布时间】:2020-02-04 05:00:38
【问题描述】:

我有一个包含 1365 列的大型数据框,如示例所示:

df <- data.frame(X1 = c(7.48, 7.59), Y1 = c(49.16, 48.70), ID1 = c("B_1", "B_1_2"), TI1 = c(191.31, 1349.93), 
              X2 = c(8.15, 8.06), Y2 = c(48.40, 48.18), ID2 = c("B_1", "B_1_2"), TI2 = c(191.39, 1349.97),
              X3 = c(8.80, 8.87), Y3 = c(47.65, 47.20), ID3 = c("B_1", "B_1_2"), TI3 = c(191.48, 1350.05))

现在我想将此数据框拆分为一个数据框列表(即此列表中的三个数据框;12/4 = 3)。预期的列表如下所示:

dflist[[1]]

X1    Y1     ID1     TI1   
7.48  49.16  B_1    191.31
7.59  48.70  B_1_2  1349.93

dflist[[2]]

X2     Y2    ID2     TI2 
8.15   48.40   B_1    191.39
8.06   48.18   B_1_2  1349.97

dflist[[3]]

X3     Y3    ID3     TI3
8.80   47.65   B_1    191.48 
8.87   47.20   B_1_2  1350.05

我想根据每个数据帧的第 4 列重新排列(按升序)列表的每个数据帧中的数据

首先将数据框转换为列表,我使用了以下代码但不起作用

n <- seq(1,12, by = 4)

my_data <- list()
for (i in 3) {
  for (j in seq(1, 12, by = 4)) {

    my_data[[i]] <- df3[, j:j+3]

  }
}

使用以下代码对列表进行排序:

dflist1 <- lapply(dflist, function(1){
            1[with(dflist, order[, 4]), ]
           })

寻找代码来获得如上所示的预期输出(dflist)

【问题讨论】:

  • 包含每个原始“数据集”的堆叠数据集是否也是可接受的输出?如果是这样,你可以像reshape(df, varying=TRUE, sep="", direction="long") 一样重塑?

标签: r dataframe data-manipulation


【解决方案1】:

我们可以使用split.default 将数据划分为列表,使用lapply 循环每个元素,order 基于第 4 列。

dflist <- lapply(split.default(df, gl(ncol(df)/4, 4)),function(x) x[order(x[[4]]),])
dflist
#$`1`
#    X1   Y1   ID1  TI1
#1 7.48 49.2   B_1  191
#2 7.59 48.7 B_1_2 1350

#$`2`
#    X2   Y2   ID2  TI2
#1 8.15 48.4   B_1  191
#2 8.06 48.2 B_1_2 1350

#$`3`
#    X3   Y3   ID3  TI3
#1 8.80 47.6   B_1  191
#2 8.87 47.2 B_1_2 1350

【讨论】:

  • 我收到如下错误“match.fun(FUN) 中的错误:缺少参数“FUN”,没有默认值”
  • @Kumar 抱歉,里面有一个未对齐的括号。我已经更新了答案,你现在可以检查一下吗?
【解决方案2】:

Tidyverse 解决方案:使用mapselectarrange_at

library(tidyverse)

map(as.character(1:3), ~select(df, ends_with(.x)) %>% arrange_at(4))

解释:

  • map 迭代第一个参数中的元素 - 这里是 1、2、3 的字符串表示。
  • 这些元素应用于第二个参数中的函数调用,即select,这是dplyr 中的列选择方法。
  • map 的每次迭代中,选择的列是end_with 1、2、3 的列。
  • 创建该列子集后,我们将arrange_at 第 4 列。
  • map 从函数返回一个输出列表,这里是数据框 - 并为您提供已排序、子集化的数据框列表。

【讨论】:

  • 我的数据集的列名相同,即 X、Y、ID、TI、X、Y、ID、TI、X、Y、ID、TI。对于具有相同名称的列名,发布的代码不起作用并导致错误为“错误:无法绑定数据,因为某些参数具有相同的名称调用rlang::last_error()查看回溯。此外:有16个警告(使用 warnings() 来查看它们)"
猜你喜欢
  • 2022-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 2021-11-21
  • 2021-02-07
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多