【问题标题】:Split double-columns into separate columns and merge same-named columns将双列拆分为单独的列并合并同名列
【发布时间】:2020-01-30 15:30:19
【问题描述】:

这是一个棘手的问题,我很高兴听到解决方案。 我有我所说的“双列”,即其内容可以分成两个单独的列的列。

这是我的输入:

structure(list(`A1-A2` = c(2, 1, 1), `A1-A3` = c(2, 1, 2)), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"))

# A tibble: 3 x 2
  `A1-A2` `A1-A3`
    <dbl>   <dbl>
1       2       2
2       1       1
3       1       2

对于一个专栏,我可以展示我想要做什么,但不能展示几个:

data %>% 
  separate(`A1-A2`, into = c("A1", "A2"), sep = ":") %>% 
  mutate_at(.vars = c(1:2), as.numeric) %>% 
  mutate(A2 = A1 -1) %>% 
  mutate(A1 = ifelse(A1 == 2, 0, A1))

# A tibble: 3 x 3
     A1    A2 `A1-A3`
  <dbl> <dbl>   <dbl>
1     0     1       2
2     1     0       1
3     1     0       2
  • 这会将A1-A2 列拆分为两个单独的列A1 和A2。
  • 如果其值为 1,则在左列 (A1) 中设置 1
  • 如果其值为 2,则将 1 设置到右列 (A2) 正如您在上面的代码中所见,这仅适用于拆分 1 个双列。

结果表最终应该像这样汇总每一列的所有获胜分数:

# A tibble: 1 x 3
     A1    A2    A3
1     3     1     2

两个挑战:

  1. 如何以通用格式为任意数量的双列制定我的代码?

  2. 如何避免由于多个拆分列具有相同名称而出现的问题(例如,当拆分双列 A1-A2, A1-A3, A2-A3 时,它们将出现两次 A1, A2, A3)??

首选tidyverse (purrr::map) 中的方法,但我对其他解决方案持开放态度。

很棘手,不是吗?

【问题讨论】:

  • 对不起,我很想给你更多的荣誉,但在解决方案中确实提到了你
  • 是的。好的。我想你现在有解决方案了。全部。那就好了
  • 再次感谢您的帮助,@akrun - 你是最棒的!
  • 很高兴为您提供帮助

标签: r multiple-columns tidyverse purrr


【解决方案1】:

我在@akrun 的帮助下整合了这个解决方案,他启发了pivot_longermutatecase_when 一起使用。如果有人有更优雅或更短的解决方案,请发布!

data
# A tibble: 3 x 2
  `A1-A2` `A1-A3`
    <dbl>   <dbl>
1       2       2
2       1       1
3       1       2

comparisons <- data %>%
  pivot_longer(everything()) %>% 
  separate(name, c("V1", "V2"), sep = "-") %>% 
  mutate(win = case_when(value == 2 ~ V2, TRUE ~ V1)) %>% 
  select(-value) %T>% print 

# A tibble: 6 x 3
  V1    V2    win  
  <chr> <chr> <chr>
1 A1    A2    A2   
2 A1    A3    A3   
3 A1    A2    A1   
4 A1    A3    A1   
5 A1    A2    A1   
6 A1    A3    A3  

scores <- comparisons %>% 
  group_by(win) %>% 
  tally() %>% 
  pivot_wider(names_from = win, values_from = n) %T>% print 


# A tibble: 1 x 3
     A1    A2    A3
  <int> <int> <int>
1     3     1     2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2020-12-16
    • 2015-09-15
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多