【发布时间】:2021-03-07 08:36:01
【问题描述】:
我想获取每行的最大数量的列名。 例如, 一张桌子可以是
x = c(1,2,4,4,3 )
y = c(2,3,3,5,4 )
z = c(4,5,2,1,1 )
df<-data.frame(x,y,z)
df
我想要得到的结果是
x y z cloumn_name
1 1 2 4 z
2 2 3 5 z
3 4 3 2 x
4 4 5 1 y
5 3 4 1 y
【问题讨论】:
标签: r
我想获取每行的最大数量的列名。 例如, 一张桌子可以是
x = c(1,2,4,4,3 )
y = c(2,3,3,5,4 )
z = c(4,5,2,1,1 )
df<-data.frame(x,y,z)
df
我想要得到的结果是
x y z cloumn_name
1 1 2 4 z
2 2 3 5 z
3 4 3 2 x
4 4 5 1 y
5 3 4 1 y
【问题讨论】:
标签: r
这是一个矢量化的解决方案:
library(dplyr)
df %>% mutate(column_name = names(df)[apply(df,1,which.max)])
【讨论】:
这也可以达到reshaping data,但是可能有点长:
library(dplyr)
library(tidyr)
#Code
df <- df %>% mutate(id=row_number()) %>%
left_join(
df %>% mutate(id=row_number()) %>%
pivot_longer(-id) %>%
group_by(id) %>%
mutate(Var=ifelse(value==max(value),name,NA)) %>%
select(c(id,Var)) %>%
filter(!is.na(Var)) %>%
filter(!duplicated(Var))
) %>% select(-id)
输出:
x y z Var
1 1 2 4 z
2 2 3 5 z
3 4 3 2 x
4 4 5 1 y
5 3 4 1 y
【讨论】:
这行得通吗:
library(dplyr)
df %>% rowwise() %>% mutate(column_name = names(df)[which.max(c_across())])
# A tibble: 5 x 4
# Rowwise:
x y z column_name
<dbl> <dbl> <dbl> <chr>
1 1 2 4 z
2 2 3 5 z
3 4 3 2 x
4 4 5 1 y
5 3 4 1 y
【讨论】:
用base R 和apply试试这个
df$maxcol <- apply(df, 1, function(x) colnames(df)[which.max(x)])
> df$maxcol
[1] "z" "z" "x" "y" "y"
这是一个非常简单的解决方案,您可以看到apply 的margin 参数设置为1,这意味着该函数将应用于df 的所有行。
【讨论】: