Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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
Dataframe:与第一列匹配的订单列内容_R_Dataframe_Sorting - Fatal编程技术网

Dataframe:与第一列匹配的订单列内容

Dataframe:与第一列匹配的订单列内容,r,dataframe,sorting,R,Dataframe,Sorting,我真不敢相信,在我从R.休息了三年之后,我还在为这个挣扎 基本上,我有一个数据框,在第一列中列出了所有可能的值。后续列具有一个值或NA。我希望对后面的每一列进行排序,这样当它在某个点上包含值时,它应该位于第一列中该值所在的行中 用一个例子可能更容易解释: 原件: Letters Category1 Category2 Category3 Category4 A NA A NA NA B A NA N

我真不敢相信,在我从R.休息了三年之后,我还在为这个挣扎

基本上,我有一个数据框,在第一列中列出了所有可能的值。后续列具有一个值或NA。我希望对后面的每一列进行排序,这样当它在某个点上包含值时,它应该位于第一列中该值所在的行中

用一个例子可能更容易解释:

原件:

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