如何创建基于同一行中另一列的值命名的新列?

时间:2020-07-17 05:49:27

标签: r string dataframe

我希望添加一列,该列根据同一行中的字符串值进行重命名。

例如,如何创建一个新列,在此表的PlayerID的末尾显示数字或文本?因此,我想要这样:

PlayerID           
Hank Aaron + 7      
Babe Ruth + 5       
Ted Williams + 2i   
Hank Aaron + Outfield
Lou Gehrig + FirstBase

要成为这个人

PlayerID                 NewColumn 
Hank Aaron + 7            7 
Babe Ruth + 5             5 
Ted Williams + 2i         2i 
Hank Aaron + Outfield     Outfield 
Lou Gehrig + FirstBase    FirstBase

如您在上面看到的,我需要将加号后的所有内容包括在新列中。有时加号后的值是数字,有时是字符和数字,有时只是字符。 预先感谢!

3 个答案:

答案 0 :(得分:3)

您可以使用正则表达式捕获加号({{1)}之后的所有内容:

+

反之,而不是捕获,请删除所有df$newcol <- sub('.*\\+\\s*(.*)$', '\\1', df$PlayerID) df$newcol #[1] "7" "5" "2i" "Outfield" "FirstBase"

"+"

如果sub('.*\\+\\s*', '', df$PlayerID) 之后只有一个单词,您也可以使用不带正则表达式的+来获取最后一个单词。

stringr::word

数据

stringr::word(df$PlayerID, -1)

答案 1 :(得分:1)

如果PlayerID列中只有一个加号,则可以在基数R中组合sapplystrsplit

df$NewColumn <- sapply(strsplit(df$PlayerID, split = " + ", fixed = TRUE), function(x) x[[2]])

df
#                 PlayerID NewColumn
# 1         Hank Aaron + 7         7
# 2          Babe Ruth + 5         5
# 3      Ted Williams + 2i        2i
# 4  Hank Aaron + Outfield  Outfield
# 5 Lou Gehrig + FirstBase FirstBase

答案 2 :(得分:0)

这是tidyverse的策略。

library(tidyverse)

PlayerID <- c(
"Hank Aaron + 7",
"Babe Ruth + 5",       
"Ted Williams + 2i",  
"Hank Aaron + Outfield",
"Lou Gehrig + FirstBase"
)

df <- data.frame(PlayerID, stringsAsFactors = F)
df %>% 
  separate(PlayerID,into = c('Player', 'a', 'newColumn'), fill = 'right') %>% 
  unite('Name',Player:a, remove = F, sep = ' ') %>% 
  select(-c(Player:a))
#>           Name newColumn
#> 1   Hank Aaron         7
#> 2    Babe Ruth         5
#> 3 Ted Williams         2i
#> 4   Hank Aaron  Outfield
#> 5   Lou Gehrig FirstBase