R:将字符串连接到一行中的每一列(不包括 col 1,可变 col 长度,字符串保存在每行的 col 1 中)

R: Concatenating a string to every column in a row (excluding col 1, variable col length, the string is held in col 1 of each row)

我有一个包含多个 lines/rows 的制表符分隔文件,每行包含可变数量的列:

Name1 String111 String112 NA        NA
Name2 String121 String122 String123 NA
Name3 String131 String132 String133 String134

等等(没有关于哪一行有多少条目的模式)。我想将第一列中的名称添加到 line/row 中每个占用的 (!= NA) 列的开头,这样我最终得到:

Name1 Name1String111 Name1String112 NA             NA
Name2 Name2String121 Name2String122 Name2String123 NA
Name3 Name3String131 Name3String132 Name3String133 Name3String134

我的尝试我的容量限制正在更改所有行中单个列的值:

Table$X2 <- paste(Table$X1, Table$X2)

我开始为所有专栏工作的机会:

NewTable <- lapply(2:nrow(Table), 
function (x) get(paste0("Table$X", x )) <-  paste(Table$X1, " ", get(paste0("Table$X", x )))
)

最终我的目标是拥有一个与一组名称关联的 /n 分隔变量列表。

例如,如果我最后想要 (Name1, Name2) 我会:

Name1String111 
Name1String112
Name2String121 
Name2String122 
Name2String123

我的计划是使用我从这个问题中创建的 table 删除第一列,然后将所有剩余的列转换为行。

跨非 V1 的列进行变异,并将 V1 连接到当前列中的值。

text="Name1 String111 String112 NA        NA
Name2 String121 String122 String123 NA
Name3 String131 String132 String133 String134"

df=read.table(text=text, stringsAsFactors = FALSE)
library(dplyr)
library(stringr)
mutate(df, across(-V1, ~str_c(V1, .)))

     V1             V2             V3             V4             V5
1 Name1 Name1String111 Name1String112           <NA>           <NA>
2 Name2 Name2String121 Name2String122 Name2String123           <NA>
3 Name3 Name3String131 Name3String132 Name3String133 Name3String134

您可以通过 tidyverse 的功能组合来实现这一点。每一步都将 管道 进入下一个。

  1. 正在定义数据并加载 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
  1. mutate() 除第一列外的所有列。该函数将第一列粘贴到每个值,NAs.
  2. 除外
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
  1. 去掉第一列
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
  1. 转置或透视 较长格式的数据,因此每个观察都有自己的行。请注意,这还会生成一个列,指示上一列的名称。您可以使用 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
  1. 删除 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 创建

使用 lapply 遍历每一列并将 V1 列粘贴到它们。

df[-1] <- lapply(df[-1], function(x) stringr::str_c(df$V1, x))
df
#     V1             V2             V3             V4             V5
#1 Name1 Name1String111 Name1String112           <NA>           <NA>
#2 Name2 Name2String121 Name2String122 Name2String123           <NA>
#3 Name3 Name3String131 Name3String132 Name3String133 Name3String134

数据

df <- structure(list(V1 = c("Name1", "Name2", "Name3"), V2 = c("String111", 
"String121", "String131"), V3 = c("String112", "String122", "String132"
), V4 = c(NA, "String123", "String133"), V5 = c(NA, NA, "String134")), 
class = "data.frame", row.names = c(NA, -3L))