行之间的串联
Concatenation between rows
我有一个包含两列的数据框:
C1 <- c("abcd > de > efg", "hij > kl > iiii", "aa", "a > bbb")
C2 <- c("1980","1982","1989","1989")
df <- data.frame(C1, C2, stringsAsFactors = FALSE)
我的目标是像这样连接其中两个的参数:
result <- c("1980abcd > 1980de > 1980efg", "1982hij > 1982kl > 1982iiii", "1989aa", "1989a > 1989bbb")
我该怎么做?谢谢
使用 strsplit,应用并粘贴:
library(dplyr)
df <- tibble(C1=strsplit(C1," > "),C2)
res <- unlist(apply(df,1,function(y){paste(paste(x$C2,x$C1,sep=""),collapse=" > ")}))
# [1] "1980abcd > 1980de > 1980efg" "1982hij > 1982kl > 1982iiii" "1989aa"
# [4] "1989a > 1989bbb"
通过 base R 的一种方法是使用拆分 C1
向量并使用 mapply
粘贴 C2
,即
v1 <- mapply(function(x, y) paste(paste0(x, y), collapse = ' > '), C2, strsplit(C1, ' > '))
unname(v1)
#[1] "1980abcd > 1980de > 1980efg" "1982hij > 1982kl > 1982iiii" "1989aa" "1989a > 1989bbb"
注意: mapply
(即 v1
)的结果是一个命名向量。因此,我使用 unname
来获得您想要的结构。但是,请注意,命名向量仍然是一个向量,并且会如此表现。
这是一种不需要拆分每个字符串并重新粘贴在一起的方法:
mapply(function(x,y) gsub("(^|\s)(?=[a-z]+)", paste0("\1", y), x, perl = TRUE),
df$C1, df$C2, USE.NAMES = FALSE)
#[1] "1980abcd > 1980de > 1980efg" "1982hij > 1982kl > 1982iiii"
#[3] "1989aa" "1989a > 1989bbb"
正则表达式模式 (^|\s)(?=[a-z]+)
匹配字符串的开头或 space 后跟小写字符,然后用相应的 C2 条目替换它。
这是一个咕噜咕噜的替代品:
library(purrr)
strsplit(df$C1, " > ") %>% map2_chr(df$C2, ~paste(.y, .x, sep = "", collapse=" > "))
#[1] "1980abcd > 1980de > 1980efg" "1982hij > 1982kl > 1982iiii"
#[3] "1989aa" "1989a > 1989bbb"
我有一个包含两列的数据框:
C1 <- c("abcd > de > efg", "hij > kl > iiii", "aa", "a > bbb")
C2 <- c("1980","1982","1989","1989")
df <- data.frame(C1, C2, stringsAsFactors = FALSE)
我的目标是像这样连接其中两个的参数:
result <- c("1980abcd > 1980de > 1980efg", "1982hij > 1982kl > 1982iiii", "1989aa", "1989a > 1989bbb")
我该怎么做?谢谢
使用 strsplit,应用并粘贴:
library(dplyr)
df <- tibble(C1=strsplit(C1," > "),C2)
res <- unlist(apply(df,1,function(y){paste(paste(x$C2,x$C1,sep=""),collapse=" > ")}))
# [1] "1980abcd > 1980de > 1980efg" "1982hij > 1982kl > 1982iiii" "1989aa"
# [4] "1989a > 1989bbb"
通过 base R 的一种方法是使用拆分 C1
向量并使用 mapply
粘贴 C2
,即
v1 <- mapply(function(x, y) paste(paste0(x, y), collapse = ' > '), C2, strsplit(C1, ' > '))
unname(v1)
#[1] "1980abcd > 1980de > 1980efg" "1982hij > 1982kl > 1982iiii" "1989aa" "1989a > 1989bbb"
注意: mapply
(即 v1
)的结果是一个命名向量。因此,我使用 unname
来获得您想要的结构。但是,请注意,命名向量仍然是一个向量,并且会如此表现。
这是一种不需要拆分每个字符串并重新粘贴在一起的方法:
mapply(function(x,y) gsub("(^|\s)(?=[a-z]+)", paste0("\1", y), x, perl = TRUE),
df$C1, df$C2, USE.NAMES = FALSE)
#[1] "1980abcd > 1980de > 1980efg" "1982hij > 1982kl > 1982iiii"
#[3] "1989aa" "1989a > 1989bbb"
正则表达式模式 (^|\s)(?=[a-z]+)
匹配字符串的开头或 space 后跟小写字符,然后用相应的 C2 条目替换它。
这是一个咕噜咕噜的替代品:
library(purrr)
strsplit(df$C1, " > ") %>% map2_chr(df$C2, ~paste(.y, .x, sep = "", collapse=" > "))
#[1] "1980abcd > 1980de > 1980efg" "1982hij > 1982kl > 1982iiii"
#[3] "1989aa" "1989a > 1989bbb"