【问题标题】:Rename specific columns in data frames in a list that meets condition重命名满足条件的列表中数据框中的特定列
【发布时间】:2021-10-26 11:02:22
【问题描述】:

我有一个数据框 (df1) 和一个数据框列表 (l) (df2, df3):

df1 <- tibble(a = c(111, 222, 333, 444, 555))

df2 <- tibble(a = c(11, 22, 33, 44, 55), 
              b = c(1111, 2222, 3333, 4444, 5555),
              c = c(11111, 2222, 333, 4444, 55555),
              d = c(1, 2, 3, 4, 5))

df3 <- tibble(a = c(11, 22, 333, 44, 55), 
              b = c(11211, 2222, 3333, 4444, 5555),
              c = c(11111, 2222, 333, 4444, 55555),
              d = c(1, 2, 3, 4, 5))

l <- list(df2, df3)

我需要在列表中找到与 df1 中的值匹配的值。仅应保留列表中只有一列具有匹配值的数据框 应删除具有少于或多于 1 列的匹配值的数据框。数据框中保留的列应重命名,例如“thiscolumnhastruevalues”。在上面的例子中 df2$c 应该被重命名。 df3 应该从列表中删除,因为它有不止一列具有 TRUE 值。

我尝试了几种“匹配”“%in%”“应用”“重命名”的方法,但我无法到达我的目的地。

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一个基本的 R 选项 -

    lapply(l, function(df) {
      #count number of df1$a values in each column
      count <- colSums(sapply(df, `%in%`, df1$a))
      #IF exactly one column has that value
      if(sum(count > 0) == 1) {
        #change the column
        names(df)[count > 0] <- 'value'
        df
      } else NULL
    })
    
    [[1]]
    # A tibble: 5 x 4
    #      a     b value     d
    #  <dbl> <dbl> <dbl> <dbl>
    #1    11  1111 11111     1
    #2    22  2222  2222     2
    #3    33  3333   333     3
    #4    44  4444  4444     4
    #5    55  5555 55555     5
    
    #[[2]]
    #NULL
    

    【讨论】:

      【解决方案2】:

      我们可能会使用

      library(dplyr)
      library(purrr)
      map(l, ~ tryCatch({.x %>% 
          rename_with(~ "value", select(., where(~ any(. %in% df1$a))) %>% 
              names)}, error = function(err) NULL) )
      

      -输出

      [[1]]
      # A tibble: 5 × 4
            a     b value     d
        <dbl> <dbl> <dbl> <dbl>
      1    11  1111 11111     1
      2    22  2222  2222     2
      3    33  3333   333     3
      4    44  4444  4444     4
      5    55  5555 55555     5
      
      [[2]]
      NULL
      

      【讨论】:

        猜你喜欢
        • 2019-09-06
        • 2018-02-26
        • 2013-03-23
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 2022-08-24
        • 2020-05-16
        • 2023-01-04
        相关资源
        最近更新 更多