等效于R中Python对字符串的综合列表操作

时间:2019-01-24 20:07:50

标签: python r string list-comprehension

我要对 R 中的字符列表执行操作,如下所述:

  1. 仅保留'-'之后的内容
  2. 然后仅保留其余四个字符的前四个字符(如果长度小于四个,则以'J'完成)
  3. 将所有内容都大写

Python示例

lt = ['LTA-Yokudo', 'LTA-Luo', 'LTA-Kawasaki']
[str(x).split('-')[1][:4].upper().ljust(4, 'J') for x in lt]

预期结果

['YOKU', 'LUOJ', 'KAWA'] # in Python
c('YOKU', 'LUOJ', 'KAWA') # in R

请注意,列表中的字符串将始终包含字符'-'。

在R中做到这一点的最佳解决方案是什么?
谢谢

4 个答案:

答案 0 :(得分:4)

基本R方法:

> x <- c('LTA-Yokudo', 'LTA-Luo', 'LTA-Kawasaki')
> x1 <- toupper(substr(x,5,8))
> ifelse(nchar(x1) == 3,paste0(x1,"J"),x1)
[1] "YOKU" "LUOJ" "KAWA"

答案 1 :(得分:1)

使用stringr(以及dplyr的管道操作)的解决方案。

library(dplyr)
library(stringr)

lt <- c('LTA-Yokudo', 'LTA-Luo', 'LTA-Kawasaki')

lt2 <- lt %>%
  str_extract(pattern = "(?<=-)[A-Za-z]*") %>% # Extract letters after -
  str_sub(start = 1, end = 4) %>% # Get four letters
  str_pad(width = 4, pad = "J", side = "right") %>% # Add J at the end
  str_to_upper() # To lower case
lt2
# [1] "YOKU" "LUOJ" "KAWA"

答案 2 :(得分:1)

考虑在基R中遵循非循环解

lt = c('LTA-Yokudo', 'LTA-Luo', 'LTA-Kawasaki')

n <- toupper(substr(lt, regexpr('-', lt)+1, regexpr('-', lt)+4))
ifelse(nchar(n)==3, paste0(n, 'J'), n) 

# [1] "YOKU" "LUOJ" "KAWA"

答案 3 :(得分:0)

使用stringer程序包(在tidyverse中),您可以执行以下操作。

library(tidyverse)

lt = c('LTA-Yokudo', 'LTA-Luo', 'LTA-Kawasaki')

##If you want lower case
new_1 <- str_to_lower(str_sub(str_replace(lt, "^.*-",""),start = 1, end = 4))

new_1 

##If you want upper case
new_2 <- str_to_upper(str_sub(str_replace(lt, "^.*-",""),start = 1, end = 4))
new_2