按顺序获取每一行的列名
Getting column names of each row in order
我有一个包含三列数值的数据框。我想对每一行进行排序,并按每行的排序顺序打印一个包含列名的字符串。这是我的代码:
> 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,但只返回空白字符串:
> apply(df, 1, function(row) paste( colnames( sort( row, decreasing = T )) , collapse = " " ))
[1] "" "" ""
当我在单行上调用 apply 中的函数时,它起作用了:
> paste( colnames( sort( df[1,], decreasing = T )) , sep = " " )
[1] "d" "y" "x"
我主要是在寻找一种比 for 循环更快的方法来对大型数据帧的每一行执行此操作。而且我认为申请可能会更快,但无法让它发挥作用。
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 =
参数来控制它。然后简单地 paste
将相应的列名称组合在一起
与上述在 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
我有一个包含三列数值的数据框。我想对每一行进行排序,并按每行的排序顺序打印一个包含列名的字符串。这是我的代码:
> 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,但只返回空白字符串:
> apply(df, 1, function(row) paste( colnames( sort( row, decreasing = T )) , collapse = " " ))
[1] "" "" ""
当我在单行上调用 apply 中的函数时,它起作用了:
> paste( colnames( sort( df[1,], decreasing = T )) , sep = " " )
[1] "d" "y" "x"
我主要是在寻找一种比 for 循环更快的方法来对大型数据帧的每一行执行此操作。而且我认为申请可能会更快,但无法让它发挥作用。
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 =
参数来控制它。然后简单地 paste
将相应的列名称组合在一起
与上述在 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