[英]Add columns recursively by string match occurrence R gsub regex
我有一個 R df,其中一列 Author 看起來像這樣(為了匿名,在這篇文章中,名稱本身被替換為“Last”和“First”):
ID | 作者 |
---|---|
1 | 最后,第一和最后,第一 |
2 | 最后,第一個和最后一個,第一個和最后一個,第一個和最后一個,第一個 |
3 | 最后,第一個和最后一個,第一個和最后一個,第一個 |
我需要為每個作者的名字和姓氏添加一個新列。 它應該如下所示:
ID | 第一1 | 最后1 | 第一2 | 最后2 | 第一3 | 最后3 | 第一4 | 最后4 |
---|---|---|---|---|---|---|---|---|
1 | 第一的 | 最后的 | 第一的 | 最后的 | ||||
2 | 第一的 | 最后的 | 第一的 | 最后的 | 第一的 | 最后的 | 第一的 | 最后的 |
3 | 第一的 | 最后的 | 第一的 | 最后的 | 第一的 | 最后的 |
當然,並非所有讀數都具有相同數量的作者,因此我無法為所有行 append 指定特定數量的列。
** 注意:我已經為只有一位作者使用的列完成了此操作
data <- data %>%
mutate(FirstName=unlist(lapply(strsplit(Author,", "),function(x) x[2])),
LastName=gsub(",.*","",Author))
我怎樣才能做到這一點?
一種選擇可以是:
df %>%
mutate(map_dfr(.x = str_split(Author, ", | & "),
~ set_names(.x, ave(.x, .x, FUN = function(y) paste0(y, cumsum(duplicated(y)) + 1)))))
id Author Last1 First1 Last2 First2 Last3 First3 Last4 First4
1 1 Last, First & Last, First Last First Last First <NA> <NA> <NA> <NA>
2 2 Last, First & Last, First & Last, First & Last, First Last First Last First Last First Last First
3 3 Last, First & Last, First & Last, First Last First Last First Last First <NA> <NA>
這里我使用了一個小助手 function 來返回姓氏和名字的列表
get_names <- function(x) {
authors = strsplit(x, " & ")[[1]]
lapply(authors, \(a) setNames(strsplit(a, ", ")[[1]], c("Last", "First")))
}
然后我將它應用於每個id
、 unnest 和 pivot 寬
df %>%
group_by(id) %>%
summarize(names=list(get_names(Author))) %>%
unnest(names) %>%
unnest_wider(names) %>%
group_by(id) %>%
mutate(rn=row_number()) %>%
pivot_wider(id, names_from =rn, names_sep="",values_from = c(First,Last),names_vary="slowest")
這是使用tidyr::separate
的版本:
library(tidyr)
library(stringr)
n_auth = max(str_count(df$Author, pattern = "&")) + 1
df %>%
separate(
Author,
sep = " *[,&] ",
into = c(outer(c("First", "Last"), 1:n_auth, FUN = paste0)),
fill = "right"
)
# id First1 Last1 First2 Last2 First3 Last3 First4 Last4
# 1 1 Last First Last First <NA> <NA> <NA> <NA>
# 2 2 Last First Last First Last First Last First
# 3 3 Last First Last First Last First <NA> <NA>
在基礎 R 中,您將執行以下操作:
(df1 <- read.table(text=gsub('[,&]', '', df$Author), fill=TRUE))
V1 V2 V3 V4 V5 V6 V7 V8
1 Last First Last First
2 Last First Last First Last First Last First
3 Last First Last First Last First
然后,您可以添加名稱:
names(df1)<-paste0(c("Last", "First"), gl(ncol(df1), 2,ncol(df1)))
df1
Last1 First1 Last2 First2 Last3 First3 Last4 First4
1 Last First Last First
2 Last First Last First Last First Last First
3 Last First Last First Last First
當然,您可以將表格重新排列為first
在last
:
df1[order(sub("\\D+", '',names(df1)), sub("\\d+", '', names(df1)))]
First1 Last1 First2 Last2 First3 Last3 First4 Last4
1 First Last First Last
2 First Last First Last First Last First Last
3 First Last First Last First Last
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.