【问题标题】:How move the two rows to top of data frame in a list in R?如何将两行移动到 R 列表中数据框的顶部?
【发布时间】:2020-12-17 03:47:02
【问题描述】:

有一个数据框列表,每个数据框有不同的行和列。每个数据框的底部是总计行和百分比行。我想将百分比行移到列表的每个数据框中的顶部(第一行)和第二行的总数。这是一个数据框示例:

structure(list(PROVINCE = c("31", "34", "35", "35", "36", "94", 
"94", "94", "94", "94", "Total", "Percentage"), DISTRICT = c("71", 
"4", "7", "73", "71", "71", "71", "71", "71", "71", "Total", 
"Percentage"), SUB_DISTRI = c("90", "70", "290", "50", "20", 
"21", "30", "40", "40", "40", "Total", "Percentage"), VILLAGE = c("5", 
"3", "1", "2", "12", "3", "6", "1", "2", "4", "Total", "Percentage"
), X0_NA = c(0, 0, 0, 0, 0, 0, 0, 0, 9.5799999237061, 0, 1648.85999393463, 
0.110249308880496), X767_Sa.u..Sahu..Sahu.u..Sau = c(0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 9.75, 0.000651923611185302), X805_Adihup..Atam..Borai..Hatam..Hattam..Mansim..Miriei..Tinam..Uran = c(0, 
20.239999771118, 0, 0, 0, 0, 0, 0, 0, 0, 675.089997291566, 0.0451391906573737
), X814_Ajamaru..Atinjo..Mai.Brat..Maite..Majbrat..Maybrat..Mey.Brat = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 3834.40999031067, 0.25638383668188
), X829_Arfak..Mansibaber..Meah..Mejach..Mejah..Meyach..Meyah = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 700.749998092649, 0.0468549199276567
), X859_Ayamaru..Brat..Maibrat = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 229.680000305176, 0.0153573143811273), X942_Fayu = c(0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 214.599998474121, 0.0143490057400625), 
    X978_Kajupulau..Kayupulau = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 36.1599998474122, 0.00241780078779332)), row.names = c(1L, 
2L, 3L, 4L, 5L, 130L, 131L, 132L, 133L, 134L, 135L, 136L), class = "data.frame")

【问题讨论】:

  • 感谢您提供可重复的数据。然而,在未来,最好发布一个更简化的版本——我们称之为minimal可重现的例子。

标签: r list row


【解决方案1】:

这里有两种方法:

# Calculating the row numbers
df[c(nrow(df), nrow(df)-1, 1:(nrow(df)-2)), ]

# Using `head` and `tail`
rbind(tail(df, 2)[2:1, ], head(df, -2))

泛化为一个函数,你可以这样做:

fun <- function(df) df[c(nrow(df), nrow(df)-1, 1:(nrow(df)-2)), ]

那么,你应该可以做到:

lapply(lst_of_df, fun)

演示

这是list 中的data.frames,行数不同。

set.seed(1)
nrows <- sample(7, 5, TRUE)
lst <- lapply(nrows, function(x) {
  data.frame(row = c(paste0("row", seq_len(x)), "tot", "pct"),
             v1 = seq_len(x+2))
})

要更改所有行的顺序,请使用:

lst2 <- lapply(lst, fun)

【讨论】:

  • 如何在数据框列表中做?不只是在数据框中。
  • @user14828029,请查看更新以了解如何将其转换为应用于list 中所有data.frames 的函数。
  • 谢谢!是否可以按总水平从最大到最小对列进行排序? total 是每个数据框中的第二行。
  • @user14828029,你想看看order 函数。使用 R 中的 data.frames,您可以使用 data[row_order, column_order] 方法重新排列它们。请注意,fun 是在未指定列顺序的情况下定义的。您希望unlist 具有数值的列,确定它们的order,并将其与函数结合起来设置列顺序。我建议您尝试一下,如果您无法解决,请发布另一个问题。
猜你喜欢
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2018-04-25
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
相关资源
最近更新 更多