【问题标题】:Best approach to using for loops to reorder columns in a list of dataframes?使用 for 循环对数据框列表中的列重新排序的最佳方法?
【发布时间】:2017-08-28 11:01:09
【问题描述】:

我有一个数据框列表,我正在尝试更改列的顺序。当我使用 mtcars 运行此示例时,我收到了确切的错误消息:

cyl.4 <- mtcars %>% filter(cyl==4) %>% select(mpg,carb,gear)
cyl.5 <- mtcars %>% filter(cyl==5) %>% select(mpg,carb,gear)

x <- list(cyl.4,cyl.5)

for (i in seq_along(x)){
  names(x[[i]]) <- x[c(2,1,3)]
}

我是 R 和编程的新手,所以请原谅这个新手问题。我已经挣扎了一段时间,我想使用其他的for循环来做类似的数据清理。我找不到先前提出的关于重新排序数据框列表中的列的问题。我也尝试过使用 purrr 包,但它对我来说有点太高级了。谢谢

【问题讨论】:

  • 既然你用purrr标记了这个,你可以使用map()select()map(x, ~select(.x, c(2,1,3)))

标签: r list dplyr purrr


【解决方案1】:

在您当前的代码中,x[c(2,1,3)] 是一个 data.frame:您不想使用它来提供列名。此外,您不希望使用 names()&lt;- 只会重命名列但重新排序它们。

你可以试试:

cyl.4 <- mtcars %>% filter(cyl==4) %>% select(mpg,carb,gear)
cyl.5 <- mtcars %>% filter(cyl==5) %>% select(mpg,carb,gear)

x <- list(cyl.4,cyl.5)

for (i in seq_along(x)){
  x[[i]] <- x[[i]][c(2,1,3)]
}

【讨论】:

    【解决方案2】:

    无需循环即可轻松完成:

    x <- lapply(x, `[`, , c(2, 1, 3))
    
    x
    [[1]]
       carb  mpg gear
    1     1 22.8    4
    2     2 24.4    4
    3     2 22.8    4
    4     1 32.4    4
    5     2 30.4    4
    6     1 33.9    4
    7     1 21.5    3
    8     1 27.3    4
    9     2 26.0    5
    10    2 30.4    5
    11    2 21.4    4
    
    [[2]]
    [1] carb mpg  gear
    <0 rows> (or 0-length row.names)
    

    【讨论】:

    • 这是一个很好的方法,不过它也使用了(lapply-)循环。
    • 谢谢,我对 [, , c(2, 1, 3) 的作用有点困惑。为什么有 '[' , , ?
    • `[` 是用于从数据帧中选择元素的函数(如df[2,3])。对于数据框,它需要两个参数 - 在这种情况下,第一个是空白的(因为我们想要所有行),第二个是列。所以我们遍历列表的每个元素df,并返回df[,c(2,1,3)](也可以写成`[`(df,,c(2,1,3))
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2015-12-16
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    相关资源
    最近更新 更多