【问题标题】:Reorder rows conditional on a string variable以字符串变量为条件对行重新排序
【发布时间】:2014-07-24 23:34:01
【问题描述】:

我需要重新排序类似于下面的数据框。我需要 London 首先出现在任何不同的 Var 中,但是保持 var 的顺序(“pop,gdp,lifespec ...)是非常关键的,因为我之后正在做矩阵代数。

    City      Var value
 Chicago      pop  0.08
  London      pop  0.24
   Paris      pop  0.75
 Chicago      gdp  0.55
  London      gdp  0.49
   Paris      gdp  0.23
 Chicago lifespec  0.45
  London lifespec  0.39
   Paris lifespec  0.28
 Chicago percjobs  0.12
  London percjobs  0.13
   Paris percjobs  0.01

所以我想要的输出如下所示:

    City      Var value
  London      pop  0.24
 Chicago      pop  0.08
   Paris      pop  0.75
  London      gdp  0.49
 Chicago      gdp  0.55
   Paris      gdp  0.23
  London lifespec  0.39
 Chicago lifespec  0.45
   Paris lifespec  0.28
  London percjobs  0.13
 Chicago percjobs  0.12
   Paris percjobs  0.01

我尝试创建一个df$rank,其值为伦敦,其他值为 9。然后我尝试使用sort(),但所有伦敦值都在顶部崩溃。你有什么想法吗?

【问题讨论】:

  • 像这样使用orderDF[order(DF$Var, DF$City != "London"), ]。请下次显示dput(DF) 的输出,以便重现性。
  • @G.Grothendieck:我认为这不会保留DF$Var 的顺序,而是会按其级别顺序(可能是字母顺序)对其进行排序。首先这样做可能会有所帮助:DF$Var <- factor(DF$Var, unique(DF$Var)).

标签: r sorting row


【解决方案1】:

在这里收集问题的cmets以提供一个简单的两行。

d <- read.table(text='City Var value
 Chicago      pop  0.08
  London      pop  0.24
   Paris      pop  0.75
 Chicago      gdp  0.55
  London      gdp  0.49
   Paris      gdp  0.23
 Chicago lifespec  0.45
  London lifespec  0.39
   Paris lifespec  0.28
 Chicago percjobs  0.12
  London percjobs  0.13
   Paris percjobs  0.01', header=T)

d$Var <- factor(d$Var, unique(d$Var))
d[order(d$Var, d$City != "London"), ]

#       City      Var value
# 2   London      pop  0.24
# 1  Chicago      pop  0.08
# 3    Paris      pop  0.75
# 5   London      gdp  0.49
# 4  Chicago      gdp  0.55
# 6    Paris      gdp  0.23
# 8   London lifespec  0.39
# 7  Chicago lifespec  0.45
# 9    Paris lifespec  0.28
# 11  London percjobs  0.13
# 10 Chicago percjobs  0.12
# 12   Paris percjobs  0.01

【讨论】:

  • 这回答了变量是否按字母顺序排列的问题。如果您想重新排序行(按字符串)但所需的输出不是按字母顺序排列,有没有办法做到这一点?谢谢
【解决方案2】:
df$City <- factor(df$City, levels = c('London', 'Chicago', 'Paris'))
df$Cityf <- as.numeric(df$City)
df$Var <- factor(df$Var, levels = c('pop', 'gdp', 'lifespec', 'percjobs'))
df$Varv <- as.numeric(df$Var)
df[order(df$Varv, df$Cityf), ]
df1 <- df[order(df$Varv, df$Cityf), ]
df1[,c(1,2,3)]

      City      Var value
2   London      pop  0.24
1  Chicago      pop  0.08
3    Paris      pop  0.75
5   London      gdp  0.49
4  Chicago      gdp  0.55
6    Paris      gdp  0.23
8   London lifespec  0.39
7  Chicago lifespec  0.45
9    Paris lifespec  0.28
11  London percjobs  0.13
10 Chicago percjobs  0.12
12   Paris percjobs  0.01

我正在使用 dplyr_0.2 表示法

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 2018-03-30
    • 2019-01-24
    • 2021-10-01
    • 2022-11-29
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多