使用for循环重新排序数据框列表中的列的最佳方法?

时间:2017-08-28 11:01:10

标签: r list dplyr purrr

我有一个数据框列表,我正在尝试更改列的顺序。当我使用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包,但它对我来说有点太先进了。谢谢

2 个答案:

答案 0 :(得分:3)

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

您可以尝试:

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

答案 1 :(得分:1)

无需循环即可轻松完成此操作:

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)