Предположим, у меня есть следующий вектор:

df<- c("@Accessoires A-B [COLL]", "@Accessoires C-D [COLL]",
        "@Components A-D [COLL]","@Components [COLL]", 
        "@Accessoires [COLL]", "@Components H-Z [COLL]")

Я хотел бы удалить среднюю часть строки, где присутствуют A-B или C-D и т. Д. Это пример, в моем dataframe есть много возможностей для буквенных комбинаций.

Итак, желаемый результат будет:

"@Accessoires [COLL]" 
"@Accessoires [COLL]" 
"@Components [COLL]"  
"@Components [COLL]"  
"@Accessoires [COLL]" 
"@Components [COLL]" 

Мой вопрос заключается в том, как добиться этого в R, не определяя все буквенные комбинации?

0
MC09 20 Авг 2018 в 12:24

3 ответа

Лучший ответ

Вы можете использовать sub() и некоторые регулярные выражения:

sub("\\s[A-Z]-[A-Z]\\s", " ", df)
[1] "@Accessoires [COLL]" "@Accessoires [COLL]" "@Components [COLL]"  "@Components [COLL]" 
[5] "@Accessoires [COLL]" "@Components [COLL]" 

Регулярные выражения сводятся к:

  • \\s: один пробел
  • [A-Z]: любая (из английского) заглавная буква.

Кстати, ваш df является вектором, но не data.frame

df <- c(
  "@Accessoires A-B [COLL]", "@Accessoires C-D [COLL]","@Components A-D [COLL]",
  "@Components [COLL]", "@Accessoires [COLL]","@Components H-Z [COLL]"
)
is.data.frame(df)
[1] FALSE
2
sindri_baldur 20 Авг 2018 в 09:32

df это не data.frame, а символьный вектор. Вы можете удалить что-либо между пробелами с помощью gsub:

gsub(" .* ", " ", df)
[1] "@Accessoires [COLL]" "@Accessoires [COLL]" "@Components [COLL]"  "@Components [COLL]"  "@Accessoires [COLL]" "@Components [COLL]" 

Это то, что вы искали?

0
Vincent Bonhomme 20 Авг 2018 в 09:28

Разделите пространство, получите 1-й и последний элемент:

sapply(strsplit(df, " "), function(i) paste(head(i, 1), tail(i, 1)))

# [1] "@Accessoires [COLL]" "@Accessoires [COLL]" "@Components [COLL]" 
# [4] "@Components [COLL]"  "@Accessoires [COLL]" "@Components [COLL]" 
1
zx8754 20 Авг 2018 в 09:58
51927702