【问题标题】:Read List excel in R & then perform operation (two)在R中读取List excel然后执行操作(二)
【发布时间】:2021-09-14 05:31:56
【问题描述】:

我已经创建了一个类似的问题here,但现在的任务是从每列中选择两个条目作为输出建议

示例数据帧

df <- structure(list(A = c("A1", "A2", "A3", "A4",NA), B = c("B1", "B2", 
"B3", "B4",NA), C = c("C1", "C2", "C3", "C4", "C5"), D = c("D1", 
"D2",NA,NA,NA)), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

  • 我很抱歉,但我不想修剪输出。
  • 我想在您更改输出时进行澄清。如果超过 5 行怎么办
  • 如果其他列的行都用完了,输出会继续追加。
  • 看起来不错,能不能实现我在评论里发的内容

标签: r dplyr tidyverse


【解决方案1】:

我们可以使用splitunlist

library(purrr)
library(dplyr)

df %>% split(c(1,1,2,2,2)) %>%
        unlist()%>%
        keep(!is.na(.))

1.A1 1.A2 1.B1 1.B2 1.C1 1.C2 1.D1 1.D2 2.A1 2.A2 2.B1 2.B2 2.C1 2.C2 2.C3 
"A1" "A2" "B1" "B2" "C1" "C2" "D1" "D2" "A3" "A4" "B3" "B4" "C3" "C4" "C5" 

或者干脆

df %>% split(seq_len(nrow(.))>2) %>% unlist() %>% discard(is.na) %>% unname

 [1] "A1" "A2" "B1" "B2" "C1" "C2" "D1" "D2" "A3" "A4" "B3" "B4" "C3" "C4" "C5"

【讨论】:

    【解决方案2】:

    我们可以用pivot_longer重塑为'long'格式,根据'name'分组后的行序列创建一个flag列,然后在'flag'和'name'列上做arrange,并删除不需要的列

    library(dplyr)
    library(tidyr)
    df %>% 
      pivot_longer(cols = everything(), values_to = 'Output', 
            values_drop_na = TRUE)  %>% 
      group_by(name) %>% 
      mutate(flag = row_number() > 2) %>% 
      ungroup %>% 
      arrange(flag, name) %>% 
      select(-name, -flag)
    

    -输出

    # A tibble: 15 x 1
       Output
       <chr> 
     1 A1    
     2 A2    
     3 B1    
     4 B2    
     5 C1    
     6 C2    
     7 D1    
     8 D2    
     9 A3    
    10 A4    
    11 B3    
    12 B4    
    13 C3    
    14 C4    
    15 C5    
    

    或者也可以使用group_split

    library(purrr)
    df %>%
        group_split(rn = row_number() > 2, .keep = FALSE) %>%
        map(~ .x %>%
             unlist %>% 
             na.omit) %>% 
        unlist %>% 
        tibble(output = .)
    

    对于第二种情况,我们需要一个条件来创建“标志”

    df %>% 
      pivot_longer(cols = everything(), values_to = 'Output', 
            values_drop_na = TRUE) %>% 
      group_by(name) %>% 
      mutate(flag = case_when(name == 'D' ~ row_number() > 1, 
            TRUE ~ row_number() > 2)) %>% 
      ungroup %>% 
      arrange(flag, name) %>% 
      select(-name, -flag)
    

    -输出

    # A tibble: 15 x 1
       Output
       <chr> 
     1 A1    
     2 A2    
     3 B1    
     4 B2    
     5 C1    
     6 C2    
     7 D1    
     8 A3    
     9 A4    
    10 B3    
    11 B4    
    12 C3    
    13 C4    
    14 C5    
    15 D2    
    

    【讨论】:

    • 感谢@Akrun,我有疑问,如果我只想从 D 列中选择一行,其余 2 行如上。有没有办法做到这一点。输出将是 A1,A2,B1,B2,C1,C2,D1,A3,A4,B3,B4,C3,C4,D2,C5
    • @VaibhavSingh 你能检查一下输出 nw
    【解决方案3】:

    这可能有效

    df %>%
      mutate(E = is.na(.)%>% rowSums()) %>%
      melt(id.vars = "E")  %>%
      arrange(E) %>%
      na.omit %>% 
      select(value)
    
       value
    1     A1
    2     A2
    3     B1
    4     B2
    5     C1
    6     C2
    7     D1
    8     D2
    9     A3
    10    A4
    11    B3
    12    B4
    13    C3
    14    C4
    19    C5
    

    编辑

    dummy %>%
      mutate(E = is.na(.)%>% rowSums()) %>%
      melt(id.vars = "E")  %>%
      na.omit %>%
      arrange(E) %>%
      mutate(FF = max(E)) %>%
      group_by(variable) %>%
      mutate( E = ifelse(variable == "D" & !(value == first(value)), FF - 0.5, E)) %>%
      arrange(E) %>% select(value)
    
       variable value
       <fct>    <chr>
     1 A        A1   
     2 A        A2   
     3 B        B1   
     4 B        B2   
     5 C        C1   
     6 C        C2   
     7 D        D1   
     8 A        A3   
     9 A        A4   
    10 B        B3   
    11 B        B4   
    12 C        C3   
    13 C        C4   
    14 D        D2   
    15 C        C5
    

    【讨论】:

    • 谢谢@Park,我有疑问,如果我只想从 D 列中选择一行,其余 2 行如上。有没有办法做到这一点。输出将是 A1,A2,B1,B2,C1,C2,D1,A3,A4,B3,B4,C3,C4,D2,C5
    • @VaibhavSingh 你想要哪一个? D2 - C5C5 - D2
    • D2, C5 因为那是 D 的逻辑完成,然后 C 待定。如果剩下任何其他列,我们在任何情况下都不想选择超过 2 行。
    • @VaibhavSingh 我在上面添加了另一个代码。它也适用于其他数据
    猜你喜欢
    • 2021-08-19
    • 2018-01-07
    • 1970-01-01
    • 2015-05-12
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    相关资源
    最近更新 更多