Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按顺序获取每行的列名_R_Performance_Apply - Fatal编程技术网

R 按顺序获取每行的列名

R 按顺序获取每行的列名,r,performance,apply,R,Performance,Apply,我有一个包含三列数值的数据框。我想对每一行进行排序,并按每一行的排序顺序打印一个带有列名的字符串。这是我的密码: > df <- data.frame(x = c(1,2,3), y = c(3,1,2), d = c(4,0, 5)) > df x y d 1 1 3 4 2 2 1 0 3 3 2 5 > for(r in 1:nrow(df)) + print(paste(colnames(sort(df[r,])), collapse = " ")) [1]

我有一个包含三列数值的数据框。我想对每一行进行排序,并按每一行的排序顺序打印一个带有列名的字符串。这是我的密码:

> df <- data.frame(x = c(1,2,3), y = c(3,1,2), d = c(4,0, 5))
> df
  x y d
1 1 3 4
2 2 1 0
3 3 2 5
> for(r in 1:nrow(df))
+ print(paste(colnames(sort(df[r,])), collapse = " "))
[1] "x y d"
[1] "d y x"
[1] "y x d"
当我在一行上调用apply中的函数时,它可以工作:

> paste( colnames( sort( df[1,], decreasing = T )) , sep = " " )
[1] "d" "y" "x"
我主要是寻找一种比for循环更快的方法来对大型数据帧的每一行执行此操作。我认为apply可能会更快,但无法让它发挥作用

t(apply(df, 1, function(x) names(x)[order(x)]))
这个问题在我的阅读中又出现了,所以我想应该修改一下,增加更多的方法。。以后可能会帮助某人:

library(data.table)
setDT(df)[, paste(colnames(df)[order(.SD)], collapse = " "), by = 1:nrow(df)]
逻辑:按行分组索引(表示按行操作)-然后将
rank
应用于每个组(本质上是一行)
.SD
表示数据的子集(所有列)(您也可以使用
.SDcols=
参数进行控制。然后简单地
将相应的列名粘贴在一起

与上述在
dplyr中实现的逻辑相同

library(dplyr)
library(tidyr)
df %>% rowwise() %>% 
       do(rank = paste(colnames(df)[order(unlist(.))], collapse = " ")) %>% 
       unnest()
输出:

#   nrow    V1
#1:    1 x y d
#2:    2 d y x
#3:    3 y x d
这个问题在我的阅读中又出现了,所以我想应该编辑一下,添加更多的方法……可能会对以后的人有所帮助:

library(data.table)
setDT(df)[, paste(colnames(df)[order(.SD)], collapse = " "), by = 1:nrow(df)]
逻辑:groupby row index(表示按行操作)-然后对每个组(本质上是一行)应用
rank
.SD
表示数据的子集(所有列)(您也可以使用
.SDcols=
参数进行控制。然后简单地
将列名粘贴在一起

与上述在
dplyr中实现的逻辑相同

library(dplyr)
library(tidyr)
df %>% rowwise() %>% 
       do(rank = paste(colnames(df)[order(unlist(.))], collapse = " ")) %>% 
       unnest()
输出:

#   nrow    V1
#1:    1 x y d
#2:    2 d y x
#3:    3 y x d

这基本上是可行的,但我不得不稍微将其更改为
apply(df,1,函数(x)粘贴(名称(x)[order(x)],collapse=“”)
是的!太棒了!我没有看到您预期的输出。apologise@Anand刚刚添加了另一种方法,基本上是可行的,但我不得不稍微将其更改为
apply(df,1,function(x))paste(names(x)[order(x)],collapse=“”))
是的!太棒了!我没有看到您预期的输出。apologise@Anand刚刚添加了另一种方法。您的应用失败,因为在
应用中,行是一个数字向量,没有行名称。当您对单行执行相同操作时,单行实际上仍然是data.frame,因此单行版本可以工作。无论如何,y您可能希望使用秩/顺序来使用这两个答案。您的应用失败,因为在
apply
中,行是一个数字向量,没有行名称。当您对单行执行相同操作时,单行实际上仍然是data.frame,因此单行版本可以工作。无论如何,您可能希望使用秩/顺序来使用这两个答案。