代码之家  ›  专栏  ›  技术社区  ›  TarJae

如果column1名称==按组列出的column2中的第一个(值),则有条件地从column1获取值

  •  1
  • TarJae  · 技术社区  · 4 年前

    我有一个假数据框:

    df <- structure(list(Group = c(1L, 1L, 2L, 2L), A = 1:4, B = 5:8, C = 9:12, 
    X = c("A", "A", "B", "B")), class = "data.frame", row.names = c(NA, -4L))
    
      Group A B  C X
    1     1 1 5  9 A
    2     1 2 6 10 A
    3     2 3 7 11 B
    4     2 4 8 12 B
    

    我试着

    期望输出:

    Group   A   B   C   X new_col
    1       1   5   9     A 1
    1       2   6   10    A 1
    2       3   7   11    B 7
    2       4   8   12    B 7
    

    library(dplyr)
    
    df %>% 
      group_by(Group) %>% 
      mutate(across(c(A,B,C), ~ifelse(first(X) %in% colnames(.), first(.), .), .names = "new_{.col}"))
    
      Group     A     B     C X     new_A new_B new_C
      <int> <int> <int> <int> <chr> <int> <int> <int>
    1     1     1     5     9 A         1     5     9
    2     1     2     6    10 A         1     5     9
    3     2     3     7    11 B         3     7    11
    4     2     4     8    12 B         3     7    11
    
    2 回复  |  直到 4 年前
        1
  •  1
  •   tmfmnk    4 年前

    df %>%
        rowwise() %>%
        mutate(new_col = get(X)) %>%
        group_by(Group, X) %>%
        mutate(new_col = first(new_col))
    
     Group     A     B     C X     new_col
      <int> <int> <int> <int> <chr>   <int>
    1     1     1     5     9 A           1
    2     1     2     6    10 A           1
    3     2     3     7    11 B           7
    4     2     4     8    12 B           7
    
        2
  •  1
  •   jay.sf    4 年前

    使用 by + 1 "Group"

    transform(df, new_col=do.call(rbind, by(df, df$Group, \(x) 
                                            cbind(paste(x$X, x[1, x$Group[1] + 1])))))
    #   Group A B  C X new_col
    # 1     1 1 5  9 A     A 1
    # 2     1 2 6 10 A     A 1
    # 3     2 3 7 11 B     B 7
    # 4     2 4 8 12 B     B 7
              
    

    注: R version 4.1.2 (2021-11-01) .


    df <- structure(list(Group = c(1L, 1L, 2L, 2L), A = 1:4, B = 5:8, C = 9:12, 
        X = c("A", "A", "B", "B")), class = "data.frame", row.names = c(NA, 
    -4L))
    
    推荐文章