如何在不丢失列名的情况下对数据框的每一行进行排序
How to sort each row of a data frame WITHOUT losing the column names
我想对数据框的每一行进行排序而不丢失 R 中的列名。
我知道这个 accepted answer 有效,但是这个方法不保留名称,如下所示:
data_5x3.csv
A,B,C,D,E
5,1,3,2,8
4,3,9,1,6
7,5,2,9,4
我的代码:
df <- read.csv("data_5x3.csv")
df
# A B C D E
# 1 5 1 3 2 8
# 2 4 3 9 1 6
# 3 7 5 2 9 4
names(df)
# [1] "A" "B" "C" "D" "E"
sorted_df <- t(apply(df, 1, sort))
sorted_df
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 2 3 5 8
# [2,] 1 3 4 6 9
# [3,] 2 4 5 7 9
names(sorted_df)
# NULL
现在名字都没有了。
怎样才能避免名字丢失?
存储名称并应用它们:
nm = names(df)
sorted_df <- as.data.frame(t(apply(df, 1, sort)))
names(sorted_df) = nm
如果您愿意,可以将其压缩为一行:
sorted_df = setNames(as.data.frame(t(apply(df, 1, sort))), names(df))
另一个可能的解决方案:
library(dplyr)
df %>% apply(1, sort) %>% t %>% `colnames<-`(colnames(df))
#> A B C D E
#> [1,] 1 2 3 5 8
#> [2,] 1 3 4 6 9
#> [3,] 2 4 5 7 9
您可以像下面这样尝试 order
+ row
m <- t(df)
df[] <- t(`dim<-`(m[order(col(m), m)], dim(m)))
你将获得
> df
A B C D E
1 1 2 3 5 8
2 1 3 4 6 9
3 2 4 5 7 9
我想对数据框的每一行进行排序而不丢失 R 中的列名。
我知道这个 accepted answer 有效,但是这个方法不保留名称,如下所示:
data_5x3.csv
A,B,C,D,E
5,1,3,2,8
4,3,9,1,6
7,5,2,9,4
我的代码:
df <- read.csv("data_5x3.csv")
df
# A B C D E
# 1 5 1 3 2 8
# 2 4 3 9 1 6
# 3 7 5 2 9 4
names(df)
# [1] "A" "B" "C" "D" "E"
sorted_df <- t(apply(df, 1, sort))
sorted_df
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 2 3 5 8
# [2,] 1 3 4 6 9
# [3,] 2 4 5 7 9
names(sorted_df)
# NULL
现在名字都没有了。
怎样才能避免名字丢失?
存储名称并应用它们:
nm = names(df)
sorted_df <- as.data.frame(t(apply(df, 1, sort)))
names(sorted_df) = nm
如果您愿意,可以将其压缩为一行:
sorted_df = setNames(as.data.frame(t(apply(df, 1, sort))), names(df))
另一个可能的解决方案:
library(dplyr)
df %>% apply(1, sort) %>% t %>% `colnames<-`(colnames(df))
#> A B C D E
#> [1,] 1 2 3 5 8
#> [2,] 1 3 4 6 9
#> [3,] 2 4 5 7 9
您可以像下面这样尝试 order
+ row
m <- t(df)
df[] <- t(`dim<-`(m[order(col(m), m)], dim(m)))
你将获得
> df
A B C D E
1 1 2 3 5 8
2 1 3 4 6 9
3 2 4 5 7 9