R - tidyr - 变异并传播多列

标签 r tidyr

我在 R 中有以下数据框

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

my_df_test
  V1 V2 V3 V4 V5 V6 V7
1  1  A S1  x  y  A  D
2  2  B S1  x  y  B  E
3  1  A S2  x  y  C  F

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

> my_df_test

   V1 V2     V3 V4 V5  V6_S1   V6_S2   V7_S1   V7_S2
 1  1  A S1, S2  x  y      A       C       D       F
 2  2  B     S1  x  y      B      NA       E      NA

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

  • V3 现在包含 df 中所有行的值,其中 V1 和 V2 中的值相同。它们之间用“,”分隔
  • 有新的 V6 和 V7 列包含这些列的原始值

其余的列和值应保持不变。

我的代码可以在只有 1 个“V6”之类的列时运行。然而,当有多个时,这就不再起作用了。

my_df_test %>%
    group_by(V1, V2) %>%
    mutate(new = paste0("V6_", V3), V3 = toString(V3)) %>%
    spread(new, V6)

所以我的问题是我的代码应该如何适应变异和传播多个列?

最佳答案

您可以使用最近 tidyr 1.0.0 release 中添加的新 pivot_wider(),而不是 spread()。 。它有一个 values_from 参数,允许您一次指定多个列:

library(dplyr)
library(tidyr)

my_df_test %>% 
  group_by(V1, V2) %>% 
  mutate(new = V3, V3 = toString(V3)) %>% 
  pivot_wider(
    names_from  = new,
    values_from = c(V6, V7)
  )
#> # A tibble: 2 x 9
#> # Groups:   V1, V2 [4]
#>      V1 V2    V3     V4    V5    V6_S1 V6_S2 V7_S1 V7_S2
#>   <dbl> <fct> <chr>  <fct> <fct> <fct> <fct> <fct> <fct>
#> 1     1 A     S1, S2 x     y     A     C     D     F    
#> 2     2 B     S1     x     y     B     <NA>  E     <NA>

reprex package 于 2019-09-18 创建(v0.3.0)

关于R - tidyr - 变异并传播多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57993552/

相关文章:

r - Tidyr 如何传播到发生次数

r - 使用不同长度的向量与 tidyr 分开

r - 将 `unnest_wider()` 递归应用于所有列,直到不再有嵌套的列表列?

R : read timeseries data using xts package

r - 在 r、ggplot2、lattice 或latticeExtra 中创建更连续的调色板

r - 如何在导航栏页面布局中插入值框?

r - 修改ggplot2中圆环图百分比标签的位置和格式

r - 在 R 中将未知长度的序列拆分为一定数量的集合

r - Sparklyr:如何将列表列分解为 Spark 表中自己的列?

r - 使用 dplyr 收集将评论与值匹配