【问题标题】:How to sort each row within a data.table? [duplicate]如何对 data.table 中的每一行进行排序? [复制]
【发布时间】:2019-03-12 06:47:06
【问题描述】:

data.table 对每行中的值进行排序的方式是什么?我可以很容易地编写一个循环来逐行进行排序,但我认为这不是一种非常聪明的做事方式。

例子:

让我们有一个data.table 喜欢:

df = data.table(ID = c('a', 'b', 'c', 'd', 'e', 'f'),
                v1 = c(1,2,1,3,4,5),
                v2 = c(2,3,6,1,0,2),
                v3 = c(0,0,1,2,3,5))

我可以像这样使用for loop 对其进行排序:

for (i in 1:nrow(df))
{
  df[i, 2:4] = sort(df[i, 2:4], decreasing = T)
}

它给出了预期的结果:

   ID v1 v2 v3
1:  a  2  1  0
2:  b  3  2  0
3:  c  6  1  1
4:  d  3  2  1
5:  e  4  3  0
6:  f  5  5  2

但这似乎是一种很慢的做事方式。

【问题讨论】:

  • @zx8754 Akrun 的解决方案有效。我应该关闭还是完全删除?
  • 请不要删除,有重复的帖子很好。
  • 对于未来的读者:这就是 akrun 对上述数据集的回答:dcast(melt(df, id.var='ID')[order(-value), .SD, ID][, N := 1:.N , .(ID)], ID~N, value.var=c("value"))
  • 这个问题与stackoverflow.com/questions/35891340/row-wise-sorting-in-r 中提出的问题不同,尽管 Akrun 的回答包括这个问题。在这个问题中,是否询问如何使用“data.table”进行排序。就谷歌搜索键而言,它很重要。您不应该关闭问题的答案。

标签: r data.table


【解决方案1】:

你必须使用data.table吗?带有MARGIN = 1 方法的基本R apply 怎么样?

df <- as.data.frame(df)
df[-1] <- t(apply(df[-1], 1, function(x) sort(x, decreasing = T)))
df
#  ID v1 v2 v3
#1  a  2  1  0
#2  b  3  2  0
#3  c  6  1  1
#4  d  3  2  1
#5  e  4  3  0
#6  f  5  5  2

【讨论】:

  • 他们想要data.table,如果它是dataframe,那么我会关闭为重复。
  • 在链接中查看 akrun 的答案,它有 data.table 答案,要求略有不同,但可能是相关的。
  • 当您排除第一个非数字列时,很好地避免了向上转换为 character。对于不经意的读者来说,可能只是因为它不打算排序而被排除在外,但如果在apply 的第一个参数中一起传递非数字列和数字列,它们都会以character 结束,因此 (1) 后续数据将是不同的类别,并且 (2) 将按字母排序,而不是数字,可能不是您想要的。
  • 啊,是的@zx8754,你是对的;看起来像个骗子,akrun 的回答给出了一个很好的data.table 解决方案。你应该关闭。我很乐意删除,但也许这些 cmets+explanations 有用吗?
猜你喜欢
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2012-10-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2023-03-20
相关资源
最近更新 更多