【问题标题】:How to sort data rowwise in R如何在R中按行对数据进行排序
【发布时间】:2019-10-31 21:30:11
【问题描述】:

在 R 中按升序对数据框进行逐行排序

我有两个数据框

x <- data.frame("Age1"=c(21, 15, 16), "Age2"=c(14, 9, 11), "Age3"=c(5, 10, 8))
y <- data.frame("Age1"=c(10, 20, 9), "Age"=c(14, 10, 11), "Age3"=c(7, 14, 10))

x
  Age1 Age2 Age3
1   21   14    5
2   15    9   10
3   16   11    8

y
  Age1 Age Age3
1   10  14    7
2   20  10   14
3    9  11   10

我需要按升序对数据 x 行进行排序,并对 y 应用相同的排序机制

for (i in 1:3){
  order.pop[i,] <- order(x[i,])
  x[i,] <- x[order(x[i,]),]
  y[i,] <- y[order(x[i,]),]
}

这会给出错误信息

In `[<-.data.frame`(`*tmp*`, i, , value = list(Age1 = c(16, 15,  :
  replacement element 3 has 3 rows to replace 1 rows

我有订单

order.pop
  Age1 Age2 Age3
1    3    2    1
2    3    1    2
3    3    2    1

最后我需要得到

x
  Age1 Age2 Age3
1   5   14    21
2   9   10    15
3   8   11   16

y 
  Age1 Age2 Age3
1   7   14    10
2   10   14  20 
3   10   11   9

有人可以帮忙吗?

【问题讨论】:

标签: r sorting


【解决方案1】:

我用每一行的排名来解决它:

x.rank <- apply(x, 1, rank)
x[] <- tapply(t(x), x.rank, c)
y[] <- tapply(t(y), x.rank, c)

x
#   Age1 Age2 Age3
# 1    5   14   21
# 2    9   10   15
# 3    8   11   16

y
#   Age1 Age2 Age3
# 1    7   14   10
# 2   10   14   20
# 3   10   11    9

y 的第二行与您的预期输出不同。也许你有错字或者我误解了你的问题。

【讨论】:

  • 是的,我似乎有一个错字。谢谢!我相应地更正了它
【解决方案2】:

我根据this answer写了一个小函数:

orderby <- function(x, by) {
  out <- as.data.frame(t(sapply(1:NROW(by), function(i) x[i,][order(by[i,])])))
  colnames(out) <- colnames(x)
  out
}

orderby(x, by = x)
#>   Age1 Age2 Age3
#> 1    5   14   21
#> 2    9   10   15
#> 3    8   11   16
orderby(y, by = x)
#>   Age1 Age Age3
#> 1    7  14   10
#> 2   10  14   20
#> 3   10  11    9

【讨论】:

  • 谢谢!这完美无缺。我写下的示例实际上是我的实际数据的简化版本:实际上,我在一个 data.frame 中有 48 个变量的 406 个观察值,我没有所有的值。有时数据中有一个 NA。你知道我可以如何调整函数以便将缺失值放在最后吗? (我是 R 新手)
  • 顺便说一句,如果您发现某个答案有效,但您发现了另一个问题,通常最好就其他问题提出一个新问题,包括显示/重现该问题的数据。
  • 抱歉,'y' 中的最后一行是如何升序排列的?
  • 按照x的排序。最后一行的顺序是第 3、2、1 列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 2021-10-29
  • 1970-01-01
相关资源
最近更新 更多