我有一个以制表符分隔的文件,有多行/多行,每行包含可变数量的列:
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
的功能来实现这一点。每一步都将插入到下一步中。
- 定义数据并加载
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包(v1.0.0)创建于2021-03-07