根据其他数据集列创建有序值的列字符串

create a column string of ordered values based on other dataset columns

我问这个是因为我觉得我目前的解决方案过于复杂,我希望找到更有意义的东西。我想创建一个列,其中包含基于其他列排序的逗号分隔值字符串。所以我有一个像这样的 table:

dsA = tibble(
    col1 = 21:25
  , col2 = 16:20
  , col3 = 11:15
  , col4 = 6:10
  )

   col1  col2  col3  col4
  <int> <int> <int> <int>
1    21    16    11     6
2    22    17    12     7
3    23    18    13     8
4    24    19    14     9
5    25    20    15    10

我想根据 dsA 中的列 c("col2", "col3", "col4") 的子集添加一列排序值 所以我有这个:

   col1  col2  col3  col4 idString  
  <int> <int> <int> <int> <chr>     
1    21    16    11     6 6, 11, 16 
2    22    17    12     7 7, 12, 17 
3    23    18    13     8 8, 13, 18 
4    24    19    14     9 9, 14, 19 
5    25    20    15    10 10, 15, 20

我所做的看起来像这样:


#columns to sort
sortCols <- c("col2", "col3", "col4")

#create list function
fnCreateList <- function(x)
  list(unname(x[names(x) %in% sortCols
           & !is.na(x)]))

#add the list to the tibble
dsA$colList <- apply(dsA, 1, fnCreateList)

#sort the list and convert to a string
dsA <- dsA %>%
       rowwise() %>% 
       transmute(
          col1, col2, col3, col4
          , idString = toString(sort(unlist(colList)))
        )


整个事情感觉过于复杂,我认为我没有找到正确的解决方案。

也许就是这样:

dsA = tibble(
    col1 = 21:25
  , col2 = 16:20
  , col3 = 11:15
  , col4 = 6:10
  )


v <- dsA %>% select( -col1 ) %>%
    apply( 1, function(row){ paste(sort(unlist(row)),collapse=", ") } )
dsA$idString <- v

这行得通吗:

library(dplyr)
library(stringr)

        dsA %>% rowwise() %>% mutate(id = str_c(sort(c_across(col2:col4)), collapse = ','))
# A tibble: 5 x 5
# Rowwise: 
   col1  col2  col3  col4 id      
  <int> <int> <int> <int> <chr>   
1    21    16    11     6 6,11,16 
2    22    17    12     7 7,12,17 
3    23    18    13     8 8,13,18 
4    24    19    14     9 9,14,19 
5    25    20    15    10 10,15,20
library(tidyr)
dsA = tibble(
  col1 = 21:25
  , col2 = 16:20
  , col3 = 11:15
  , col4 = 6:10
)

dsA$idString <- apply(dsA[-1], 1, function(x) toString(sort(x)))
dsA
#> # A tibble: 5 x 5
#>    col1  col2  col3  col4 idString  
#>   <int> <int> <int> <int> <chr>     
#> 1    21    16    11     6 6, 11, 16 
#> 2    22    17    12     7 7, 12, 17 
#> 3    23    18    13     8 8, 13, 18 
#> 4    24    19    14     9 9, 14, 19 
#> 5    25    20    15    10 10, 15, 20

reprex package (v2.0.0)

于 2021-05-28 创建

tidyr 有一个函数 unite 就是这样的:

library(tidyr)

dsA %>% 
  unite(idString, col4:col2, sep = ",", remove = F)

如果您想保持列顺序,可以将此输出通过管道传输到 select(all_of(names(dsA)), everything())