str_c tibble (R) 中除一列外的所有列

str_c over all but one column in tibble (R)

我是 tidyverse 的新手。我想加入除一列以外的所有列(因为其他列的名称可能会有所不同)。这里有一个 iris 的例子,它显然不起作用。谢谢:)

library(tidyverse)

dat <- as_tibble(iris)
dat %>% mutate(New = str_c(!Sepal.Length, sep="_"))

我们可以使用 select 到 select 我们要粘贴的列并应用 str_cdo.call

library(tidyverse)
dat %>% mutate(New = do.call(str_c, c(select(., !Sepal.Length), sep="_")))

但是,使用 unite 会更简单。

dat %>% unite(New, !Sepal.Length, sep="_", remove= FALSE)

#   Sepal.Length New                Sepal.Width Petal.Length Petal.Width Species
#          <dbl> <chr>                    <dbl>        <dbl>       <dbl> <fct>  
# 1          5.1 3.5_1.4_0.2_setosa         3.5          1.4         0.2 setosa 
# 2          4.9 3_1.4_0.2_setosa           3            1.4         0.2 setosa 
# 3          4.7 3.2_1.3_0.2_setosa         3.2          1.3         0.2 setosa 
# 4          4.6 3.1_1.5_0.2_setosa         3.1          1.5         0.2 setosa 
# 5          5   3.6_1.4_0.2_setosa         3.6          1.4         0.2 setosa 
# 6          5.4 3.9_1.7_0.4_setosa         3.9          1.7         0.4 setosa 
# 7          4.6 3.4_1.4_0.3_setosa         3.4          1.4         0.3 setosa 
# 8          5   3.4_1.5_0.2_setosa         3.4          1.5         0.2 setosa 
# 9          4.4 2.9_1.4_0.2_setosa         2.9          1.4         0.2 setosa 
#10          4.9 3.1_1.5_0.1_setosa         3.1          1.5         0.1 setosa 
# … with 140 more rows

使用base

dat <- iris
cols <- grepl("Sepal.Length", names(dat))
tmp <- dat[, !cols]
dat$new <- apply(tmp, 1, paste0, collapse = "_") 
head(dat)
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species                new
#> 1          5.1         3.5          1.4         0.2  setosa 3.5_1.4_0.2_setosa
#> 2          4.9         3.0          1.4         0.2  setosa 3.0_1.4_0.2_setosa
#> 3          4.7         3.2          1.3         0.2  setosa 3.2_1.3_0.2_setosa
#> 4          4.6         3.1          1.5         0.2  setosa 3.1_1.5_0.2_setosa
#> 5          5.0         3.6          1.4         0.2  setosa 3.6_1.4_0.2_setosa
#> 6          5.4         3.9          1.7         0.4  setosa 3.9_1.7_0.4_setosa

reprex package (v1.0.0)

创建于 2021-02-01

我们可以reduce

library(dplyr)
library(purrr)
library(stringr)
dat %>%
     mutate(New = select(., -Sepal.Length) %>% 
               reduce(str_c, sep="_"))
# A tibble: 150 x 6
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species New               
#          <dbl>       <dbl>        <dbl>       <dbl> <fct>   <chr>             
# 1          5.1         3.5          1.4         0.2 setosa  3.5_1.4_0.2_setosa
# 2          4.9         3            1.4         0.2 setosa  3_1.4_0.2_setosa  
# 3          4.7         3.2          1.3         0.2 setosa  3.2_1.3_0.2_setosa
# 4          4.6         3.1          1.5         0.2 setosa  3.1_1.5_0.2_setosa
# 5          5           3.6          1.4         0.2 setosa  3.6_1.4_0.2_setosa
# 6          5.4         3.9          1.7         0.4 setosa  3.9_1.7_0.4_setosa
# 7          4.6         3.4          1.4         0.3 setosa  3.4_1.4_0.3_setosa
# 8          5           3.4          1.5         0.2 setosa  3.4_1.5_0.2_setosa
# 9          4.4         2.9          1.4         0.2 setosa  2.9_1.4_0.2_setosa
#10          4.9         3.1          1.5         0.1 setosa  3.1_1.5_0.1_setosa
# … with 140 more rows