如何在data.table中对每一行进行排序?

5

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 循环 来对此进行排序,代码如下:

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

但这种做法似乎非常缓慢。

2
可能是重复的,相关的帖子:https://dev59.com/gVfUa4cB1Zd3GeqPHWCP 和 https://dev59.com/hJTfa4cB1Zd3GeqPXOQ7 - zx8754
1
@zx8754的解决方案有效。我应该关闭还是完全删除? - ira
1
请不要删除,重复的帖子也是有好处的。 - zx8754
1
对于未来的读者:这是akrun针对上述数据集的答案:dcast(melt(df, id.var='ID')[order(-value), .SD, ID][, N := 1:.N , .(ID)], ID~N, value.var=c("value")) - ismirsehregal
1
这个问题不同于 https://dev59.com/hJTfa4cB1Zd3GeqPXOQ7 中提出的问题,但 Akrun 的回答包括了这个问题。 在这个问题中,问的是如何使用 "data.table" 进行排序。从 Google 搜索关键字的角度来看,这非常重要。你不应该关闭这些问题或答案。 - ibilgen
显示剩余6条评论
1个回答

2

您是否必须使用data.table?用基本的R语言apply函数并传入MARGIN = 1参数的方法可行吗?

最初的回答:

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

4
如果他们想要使用data.table,那么如果是数据框(dataframe),我会将其关闭并标记为重复。 - zx8754
1
请参阅akrun在链接中的答案,其中包含data.table答案,稍有不同的要求,但可能具有相关性。 - zx8754
很好,你在排除第一个非数字列时避免了将其转换为“字符”的情况。对于普通读者来说,这似乎是因为它不打算排序而被排除的,但如果非数字和数字列一起传递到apply的第一个参数中,它们都将变成“字符”,因此(1)后续数据将是不同的类别,(2)排序将按字母顺序而不是数字顺序进行,这可能不是你想要的。 - r2evans
没错,@zx8754你说得对;看起来像是一个重复问题,akrun的答案给出了一个很好的data.table解决方案。你应该关闭问题。我很乐意删除,但也许这些评论和解释会有用? - Maurits Evers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接