您可以结合tidyverse 的功能来实现这一点。每一步都将通过管道进入下一个。
- 定义数据并加载
tidyverse
library(tidyverse)
my_data <-
structure(
list(
col1 = c("Name1", "Name2", "Name3"),
col2 = c("String111", "String121", "String131"),
col3 = c("String112", "String122", "String132"),
col4 = c(NA, "String123", "String133"),
col5 = c(NA, NA, "String134")
),
row.names = c(NA, -3L),
class = c("tbl_df", "tbl", "data.frame")
)
my_data
#> # A tibble: 3 x 5
#> col1 col2 col3 col4 col5
#> <chr> <chr> <chr> <chr> <chr>
#> 1 Name1 String111 String112 <NA> <NA>
#> 2 Name2 String121 String122 String123 <NA>
#> 3 Name3 String131 String132 String133 String134
-
mutate() 除第一列外的所有列。该函数将第一列粘贴到每个值,NAs 除外。
my_data %>%
mutate(across(-col1, ~if_else(!is.na(.x), paste0(col1, .x), .x)))
#> # A tibble: 3 x 5
#> col1 col2 col3 col4 col5
#> <chr> <chr> <chr> <chr> <chr>
#> 1 Name1 Name1String111 Name1String112 <NA> <NA>
#> 2 Name2 Name2String121 Name2String122 Name2String123 <NA>
#> 3 Name3 Name3String131 Name3String132 Name3String133 Name3String134
- 去掉第一列
my_data %>%
mutate(across(-col1, ~if_else(!is.na(.x), paste0(col1, .x), .x))) %>%
select(-col1)
#> # A tibble: 3 x 4
#> col2 col3 col4 col5
#> <chr> <chr> <chr> <chr>
#> 1 Name1String111 Name1String112 <NA> <NA>
#> 2 Name2String121 Name2String122 Name2String123 <NA>
#> 3 Name3String131 Name3String132 Name3String133 Name3String134
- 转置或透视较长格式的数据,因此每个观察都有自己的行。请注意,这还会生成一个列,指示前一列的名称。您可以使用
values_drop_na = TRUE 摆脱NAs。
my_data %>%
mutate(across(-col1, ~if_else(!is.na(.x), paste0(col1, .x), .x))) %>%
select(-col1) %>%
pivot_longer(everything(), names_to = "column", values_to = "string", values_drop_na = TRUE)
#> # A tibble: 9 x 2
#> column string
#> <chr> <chr>
#> 1 col2 Name1String111
#> 2 col3 Name1String112
#> 3 col2 Name2String121
#> 4 col3 Name2String122
#> 5 col4 Name2String123
#> 6 col2 Name3String131
#> 7 col3 Name3String132
#> 8 col4 Name3String133
#> 9 col5 Name3String134
- 去掉
column 列。
my_data %>%
mutate(across(-col1, ~if_else(!is.na(.x), paste0(col1, .x), .x))) %>%
select(-col1) %>%
pivot_longer(everything(), names_to = "column", values_to = "string", values_drop_na = TRUE) %>%
select(-column)
#> # A tibble: 9 x 1
#> string
#> <chr>
#> 1 Name1String111
#> 2 Name1String112
#> 3 Name2String121
#> 4 Name2String122
#> 5 Name2String123
#> 6 Name3String131
#> 7 Name3String132
#> 8 Name3String133
#> 9 Name3String134
最后,为结果指定一个名称,以便您可以按照自己的方式存储它。
result <- my_data %>%
mutate(across(-col1, ~if_else(!is.na(.x), paste0(col1, .x), .x))) %>%
select(-col1) %>%
pivot_longer(everything(), names_to = "column", values_to = "string", values_drop_na = TRUE) %>%
select(-column)
由reprex package (v1.0.0) 于 2021-03-07 创建