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



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

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

依此类推(没有关于哪一行有多少条目的模式)。我要将第一列中的名称添加到每个已占用的(!= NA)列,这样我就结束了:

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

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

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

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

使用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))

在非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之外的每个值。
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包(v1.0.0)创建于2021-03-07

相关内容

  • 没有找到相关文章

最新更新