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
的功能组合来实现这一点。每一步都将 管道 进入下一个。
- 正在定义数据并加载
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()
除第一列外的所有列。该函数将第一列粘贴到每个值,NA
s. 除外
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
摆脱 NA
s.
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 创建
使用 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))
我有一个包含多个 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
的功能组合来实现这一点。每一步都将 管道 进入下一个。
- 正在定义数据并加载
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()
除第一列外的所有列。该函数将第一列粘贴到每个值,NA
s. 除外
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
摆脱NA
s.
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 创建使用 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))