【问题标题】:Dataframe merge rows数据框合并行
【发布时间】:2019-09-17 11:39:07
【问题描述】:

我在 R 中有以下数据框

my_df <- data.frame(V1 = c(1,2,3,1), V2 = c("A","B","C","A"), V3 = c("S1", "S1", "S1", "S2"), V4 = c("x","x","x","x"), V5 = c("y","y","y","y"), V6 =c("A", "B", "C", "D"))

> my_df
  V1 V2 V3 V4 V5 V6
1  1  A S1  x  y  A
2  2  B S1  x  y  B
3  3  C S1  x  y  C
4  1  A S2  x  y  D

现在我想检查 V1 和 V2 中的值组合是否在 df 中多次出现。在我的示例中,my_df 第 1 行和第 4 行具有相同的值“1 A”和“1 A”。如果发生这种情况,我想要以下输出:

> my_df_new
  V1 V2    V3 V4 V5  V6_S1   V6_S2
1  1  A S1;S2  x  y      A       D
2  2  B    S1  x  y      B     
3  3  C    S1  x  y      C

所以基本上有两件事发生了变化:

  • V3 现在包含 df 中所有行的值,其中 V1 和 V2 中的值相同。它们由';'分隔
  • 新的 V6 列包含该列的原始值。

其余列和值应保持不变。

我怎样才能做到这一点?

【问题讨论】:

标签: r


【解决方案1】:

这是一种使用dplyrgroup_byV1V2的方法,折叠V3,创建一个新列(V7)到spread重复值。

library(dplyr)

my_df %>%
  group_by(V1, V2) %>%
  mutate(V3 = toString(V3), 
         V7 = paste0("V6_S", row_number())) %>%
  tidyr::spread(V7, V6)

#     V1 V2    V3     V4    V5  V6_S1 V6_S2
#  <dbl> <fct> <chr> <fct> <fct> <fct> <fct>
#1     1 A     S1, S2 x     y     A     D    
#2     2 B     S1     x     y     B     NA   
#3     3 C     S1     x     y     C     NA   

【讨论】:

  • 如何将其应用于数据框列表?
  • @user1987607 只需使用lapplymap 循环遍历列表中的每个数据帧并将相同的函数应用于所有数据帧。
  • 我不明白 row_number() 在这里做什么。为什么不使用 V3 中的值来为该列命名:S1 和 S2
  • 啊..是的。我没有想到我可以那样使用它。是的,你可以my_df %&gt;% group_by(V1, V2) %&gt;% mutate(V7 = paste0("V6_", V3), V3 = toString(V3)) %&gt;% tidyr::spread(V7, V6)
  • 您的命令在测试数据帧上运行良好。但是,对于我的真实数据框,它的行为并不像预期的那样。所以我必须进一步调查。
【解决方案2】:

应该有一种更简洁的方法来做到这一点,不会强迫员工,但这就是我想出的,

library(data.table)
library(splitstackshape)

cSplit(setDT(my_df)[, .(V3 = toString(V3), 
                        V4 = V4[1], 
                        V5 = V5[1], 
                        V6 = toString(V6)), .(V1, V2)], 'V6')

#   V1 V2     V3 V4 V5 V6_1 V6_2
#1:  1  A S1, S2  x  y    A    D
#2:  2  B     S1  x  y    B <NA>
#3:  3  C     S1  x  y    C <NA>

【讨论】:

    猜你喜欢
    • 2019-12-04
    • 2016-07-14
    • 2016-12-28
    • 2022-01-20
    • 2020-11-13
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多