合并 tibble 中两列的内容并将结果输出为向量
Merge the contents from two columns in a tibble and output the result as a vector
起点
假设我有以下问题:
fruits.dt <- tibble(
fruit.name = c("Apple", "Orange", "Banana"),
fruit.typ = c(2,3,5),
fruit.color = c("red", "orange", "yellow")
)
结果应该是这样的...
从这个tibble我想构建以下向量:
"Apple1","Apple2","Orange1","Orange2","Orange3","Banana1","Banana2","Banana3","Banana4", "Banana5"
或者如果你喜欢 r-code
:
fruits.final <- c("Apple1","Apple2",
"Orange1","Orange2","Orange3",
"Banana1","Banana2","Banana3", "Banana4", "Banana5"
)
向量应该如何构成?
从第 1 行开始
- 取第一列的单词fruit.name:
"Apple"
- 取fruit.typ列中的数字:
2
- 根据fruit.typ栏中的数字创建尽可能多的复合词
(此处:
2
)并使用 "Apple"
和序列 1:n
作为复合词,
其中 n
等于 fruit.typ、2
列中的数字。部分的
结果:"Apple1", "Apple2"
。部分结果大约对应于
以下代码:apple.vec <- paste0("Apple", 1:2)
从第 2 行开始
- fruit.name:
"Orange"
- fruit.type:
3
- 部分结果:
"Orange1", "Orange2", "Orange3"
或 orange.vec <- paste0("Orange", 1:3)
从第 3 行...到第 n 行
遍历所有行并从所有“部分结果”中形成一个复合向量。
解决方案尝试
我尝试过将dplyr::mutate()
与past0()
、sapply
或purr::map()
结合使用,但我对这个问题的了解太有限了。
例如:
library("tidyverse")
fruits.dt %>%
mutate(fruit.code = paste0(fruit.name, 1:fruit.type))
使用dplyr::pull()
你可以提取相应的列作为向量,但之后我也不知道该怎么做:
fruit.name.vec <- fruits.dt %>%
pull(fruit.name)
对一条链试试这个:
#Code
paste0(mapply(function(x,y) paste0(x,seq(1,y,by=1),collapse = ','),
x=fruits.dt$fruit.name,y=fruits.dt$fruit.typ,SIMPLIFY = T),
collapse = ',')
输出:
[1] "Apple1,Apple2,Orange1,Orange2,Orange3,Banana1,Banana2,Banana3,Banana4,Banana5"
或者这个向量:
#Code 2
v2 <- mapply(function(x,y) paste0(x,seq(1,y,by=1),collapse = ','),
x=fruits.dt$fruit.name,y=fruits.dt$fruit.typ)
#Unlist
v3 <- unlist(lapply(v2,function(x) strsplit(x,',')),use.names = F)
输出:
v3
[1] "Apple1" "Apple2" "Orange1" "Orange2" "Orange3" "Banana1" "Banana2" "Banana3" "Banana4"
[10] "Banana5"
起点
假设我有以下问题:
fruits.dt <- tibble(
fruit.name = c("Apple", "Orange", "Banana"),
fruit.typ = c(2,3,5),
fruit.color = c("red", "orange", "yellow")
)
结果应该是这样的...
从这个tibble我想构建以下向量:
"Apple1","Apple2","Orange1","Orange2","Orange3","Banana1","Banana2","Banana3","Banana4", "Banana5"
或者如果你喜欢 r-code
:
fruits.final <- c("Apple1","Apple2",
"Orange1","Orange2","Orange3",
"Banana1","Banana2","Banana3", "Banana4", "Banana5"
)
向量应该如何构成?
从第 1 行开始
- 取第一列的单词fruit.name:
"Apple"
- 取fruit.typ列中的数字:
2
- 根据fruit.typ栏中的数字创建尽可能多的复合词
(此处:
2
)并使用"Apple"
和序列1:n
作为复合词, 其中n
等于 fruit.typ、2
列中的数字。部分的 结果:"Apple1", "Apple2"
。部分结果大约对应于 以下代码:apple.vec <- paste0("Apple", 1:2)
从第 2 行开始
- fruit.name:
"Orange"
- fruit.type:
3
- 部分结果:
"Orange1", "Orange2", "Orange3"
或orange.vec <- paste0("Orange", 1:3)
从第 3 行...到第 n 行
遍历所有行并从所有“部分结果”中形成一个复合向量。
解决方案尝试
我尝试过将dplyr::mutate()
与past0()
、sapply
或purr::map()
结合使用,但我对这个问题的了解太有限了。
例如:
library("tidyverse")
fruits.dt %>%
mutate(fruit.code = paste0(fruit.name, 1:fruit.type))
使用dplyr::pull()
你可以提取相应的列作为向量,但之后我也不知道该怎么做:
fruit.name.vec <- fruits.dt %>%
pull(fruit.name)
对一条链试试这个:
#Code
paste0(mapply(function(x,y) paste0(x,seq(1,y,by=1),collapse = ','),
x=fruits.dt$fruit.name,y=fruits.dt$fruit.typ,SIMPLIFY = T),
collapse = ',')
输出:
[1] "Apple1,Apple2,Orange1,Orange2,Orange3,Banana1,Banana2,Banana3,Banana4,Banana5"
或者这个向量:
#Code 2
v2 <- mapply(function(x,y) paste0(x,seq(1,y,by=1),collapse = ','),
x=fruits.dt$fruit.name,y=fruits.dt$fruit.typ)
#Unlist
v3 <- unlist(lapply(v2,function(x) strsplit(x,',')),use.names = F)
输出:
v3
[1] "Apple1" "Apple2" "Orange1" "Orange2" "Orange3" "Banana1" "Banana2" "Banana3" "Banana4"
[10] "Banana5"