根据其他数据集列创建有序值的列字符串
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())
。
我问这个是因为我觉得我目前的解决方案过于复杂,我希望找到更有意义的东西。我想创建一个列,其中包含基于其他列排序的逗号分隔值字符串。所以我有一个像这样的 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())
。