给定数据帧‘dat’,其中‘Author’是作者姓名的列表列.如何使用tidyVerse函数创建仅包含第一作者姓氏的新列?

dat <- structure(list(author = list(c("Pagsberg, Anne Katrine", "Uhre, Camilla", 
"Uhre, Valdemar and"), c("Franklin, Martin E", "Sapyta, Jeffrey", 
"Freeman, Jennifer B"), c("Selles, Robert R", "Belschner, Laura", 
"Negreiros, Juliana and")), pmid = c("35305587", "21934055", 
"29179016")), row.names = c(NA, -3L), class = c("tbl_df", "tbl", 
"data.frame"))

在BASE R中,以下代码可以运行: Dat$First_Author&lt;-sApply(sApply(dat$Author,"[",1),","),"[",1)

推荐答案

一种纯粹的整齐方法是,在使用str_removego 掉第一个逗号和后面的任何元素之前,将Tibble rowwisepluck分组到List列中每一行的第一个元素.对于完成度,你可以在ungroup结尾.

library(tidyverse)

dat %>% 
  rowwise() %>% 
  mutate(first_author = pluck(author, 1) %>% str_remove(',.*$')) %>%
  ungroup()
#> # A tibble: 3 x 3
#>   author    pmid     first_author
#>   <list>    <chr>    <chr>       
#> 1 <chr [3]> 35305587 Pagsberg    
#> 2 <chr [3]> 21934055 Franklin    
#> 3 <chr [3]> 29179016 Selles 

然而,在现实中,当存在一个很好的单线性基R替代方案时,我并不觉得强制使用tidyVerse函数:

within(dat, first_author <- sapply(author, \(x) gsub(',.*$', '', x[[1]])))
#> # A tibble: 3 x 3
#>   author    pmid     first_author
#>   <list>    <chr>    <chr>       
#> 1 <chr [3]> 35305587 Pagsberg    
#> 2 <chr [3]> 21934055 Franklin    
#> 3 <chr [3]> 29179016 Selles 

R相关问答推荐

如何使用ggplot重新绘制LASO回归图?

如何删除多个.CSV文件的行

根据列表中项目的名称多次合并数据框和列表

在R中列表的结尾添加数字载体

以R中的正确顺序将日期时间字符列转换为posixct

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

如何在R中合并和合并多个rabrame?

如何将移除事件分配给动态创建的按钮?

使用strsplit()将向量操作为数据框

如何在所有绘图中保持条件值的 colored颜色 相同?

非线性混合效应模型(NLME)预测变量的置信区间

在数组索引上复制矩阵时出错

使用R中的正则表达式将一列分割为多列

`lazy_dt`不支持`dplyr/across`?

在列表中排列R数据框中的列顺序

有没有办法一次粘贴所有列

删除数据帧中特定行号之间的每第三行和第四行

ggplot R:X,Y,Z使用固定/等距的X,Y坐标绘制六边形热图

使用列中的值来调用函数调用中应使用的其他列

从字符串01JAN2021创建日期