【问题标题】:group columns in R dataframe based on values in another column根据另一列中的值对 R 数据框中的列进行分组
【发布时间】:2021-02-02 07:15:17
【问题描述】:

考虑以下一对列表

 ID<-c("A", "B")
 Var2<-c("T_X", "X_F", "R_X", "T_Y", "Y_F", "R_Y")

我创建了以下数据框

df2<-expand.grid(ID, Var2)

生成的数据帧如下

   Var1 Var2
1     A  T_X
2     B  T_X
3     A  X_F
4     B  X_F
5     A  R_X
6     B  R_X
7     A  T_Y
8     B  T_Y
9     A  Y_F
10    B  Y_F
11    A  R_Y
12    B  R_Y

我想按 Var1 列重新排序数据框,以便与 A 对应的所有值都在一起,并且与 B 一样。(注意这是一个玩具数据集,Var1 中唯一值的实际数量可能要高得多)。

以下是预期的输出

   Var1 Var2
1     A  T_X
3     A  X_F
5     A  R_X
7     A  T_Y
9     A  Y_F
11    A  R_Y
2     B  T_X
4     B  X_F
6     B  R_X
8     B  T_Y
10    B  Y_F
12    B  R_Y

我已经尝试过 df2%>% group_by(Var1)。这使数据框保持不变。

我请求有人在这里帮助我。

【问题讨论】:

  • df2 %&gt;% arrange(Var1) 的输出可以完成这项工作吗?

标签: r dplyr group-by


【解决方案1】:

我们可以反过来做。之后不需要任何ordering 或任何包

setNames(expand.grid(Var2, ID)[2:1], c("Var1", "Var2"))

-输出

#    Var1 Var2
#1     A  T_X
#2     A  X_F
#3     A  R_X
#4     A  T_Y
#5     A  Y_F
#6     A  R_Y
#7     B  T_X
#8     B  X_F
#9     B  R_X
#10    B  T_Y
#11    B  Y_F
#12    B  R_Y

或者从tidyr使用crossing

library(tidyr)
crossing(ID, Var2 = factor(Var2, levels = Var2))

-输出

#   ID    Var2 
#   <chr> <chr>
# 1 A     T_X  
# 2 A     X_F  
# 3 A     R_X  
# 4 A     T_Y  
# 5 A     Y_F  
# 6 A     R_Y  
# 7 B     T_X  
# 8 B     X_F  
# 9 B     R_X  
# 10 B     T_Y  
# 11 B     Y_F  
# 12 B     R_Y  

【讨论】:

    【解决方案2】:

    您可以使用tidyrexpand_grid,它在此处按预期工作。

    tidyr::expand_grid(ID, Var2)
    
    #   ID    Var2 
    #   <chr> <chr>
    # 1 A     T_X  
    # 2 A     X_F  
    # 3 A     R_X  
    # 4 A     T_Y  
    # 5 A     Y_F  
    # 6 A     R_Y  
    # 7 B     T_X  
    # 8 B     X_F  
    # 9 B     R_X  
    #10 B     T_Y  
    #11 B     Y_F  
    #12 B     R_Y  
    

    但是,您始终可以order df2 输出以获得所需格式的输出。

    df2 <- expand.grid(ID, Var2)
    df2[order(df2$Var1), ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 2020-12-26
      • 2023-03-08
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多