Dataframe:与第一列匹配的订单列内容
我真不敢相信,在我从R.休息了三年之后,我还在为这个挣扎 基本上,我有一个数据框,在第一列中列出了所有可能的值。后续列具有一个值或NA。我希望对后面的每一列进行排序,这样当它在某个点上包含值时,它应该位于第一列中该值所在的行中 用一个例子可能更容易解释: 原件:Dataframe:与第一列匹配的订单列内容,r,dataframe,sorting,R,Dataframe,Sorting,我真不敢相信,在我从R.休息了三年之后,我还在为这个挣扎 基本上,我有一个数据框,在第一列中列出了所有可能的值。后续列具有一个值或NA。我希望对后面的每一列进行排序,这样当它在某个点上包含值时,它应该位于第一列中该值所在的行中 用一个例子可能更容易解释: 原件: Letters Category1 Category2 Category3 Category4 A NA A NA NA B A NA N
Letters Category1 Category2 Category3 Category4
A NA A NA NA
B A NA NA D
C NA NA NA A
D NA C NA NA
E E B C NA
所需状态:
Letters Category1 Category2 Category3 Category4
A A A NA A
B NA B NA NA
C NA C C NA
D NA NA NA D
E E NA NA NA
我是否忽略了一个内置函数/库来优雅地执行此操作?我的方法可能是构建一个函数,创建一个新的数据帧并逐行检查内容,但这似乎效率很低…使用
dplyr
和tidyr
的一种方法是:
library(dplyr)
library(tidyr)
vals <- df$Letters
df %>%
pivot_longer(cols = starts_with('Category'),
values_drop_na = TRUE) %>%
group_by(value) %>%
mutate(Letters = vals[cur_group_id()]) %>%
arrange(name) %>%
pivot_wider() %>%
arrange(Letters) -> result
result
# Letters Category1 Category2 Category3 Category4
# <chr> <chr> <chr> <chr> <chr>
#1 A A A NA A
#2 B NA B NA NA
#3 C NA C C NA
#4 D NA NA NA D
#5 E E NA NA NA
库(dplyr)
图书馆(tidyr)
VAL%
pivot_longer(cols=以('Category')开头),
值\u drop\u na=TRUE)%>%
分组依据(值)%>%
变异(字母=VAL[cur_group_id()])%>%
排列(名称)%%>%
枢轴_加宽()%>%
排列(字母)->结果
结果
#信件类别1类别2类别3类别4
#
#不,不,不
#2 B不适用B不适用
#3c-NA-C-NA
#4d不,不,不
#5e-E-NA-NA
使用tidyverse
df%
轴长(-字母,值下降)%>%
变异(字母=值)%>%
排列(名称)%%>%
枢轴(字母、名称、值)
#>#tibble:5 x 5
#>信件类别1类别2类别3类别4
#>
#>A
#>2 E E
#>3C
#>4b
#>5天
由(v0.3.0)于2020年12月1日创建
使用数据表
库(data.table)
dt 1:A
#>2:B
#>3:C
#>4:D
#>5:E
由(v0.3.0)cbind于2020-12-01创建(字母=df$Letters,应用(df[,startsWith(名称(df),“类别”)],2,函数(x){y