2011-10-13 3 views
8

У меня есть большой dataframe с информацией о классификации. Вот пример:применить strsplit к определенному столбцу в data.frame

> d <- data.frame(x = c(1,2,3,4), classification = c("cl1.scl1", "cl2", "cl3-bla", "cl4.subclass2")) 
> d 
    x classification 
1 1  cl1.scl1 
2 2   cl2 
3 3  cl3-bla 
4 4 cl4.subclass2 

Прежде чем сделать какой-либо дальнейшей обработки мне нужно агрегировать информацию о классификации, а это значит, что я должен разделить классификации строк от «» и возьмите первый токен. Это результат мне нужно:

> d 
    x classification 
1 1   cl1 
2 2   cl2 
3 3  cl3-bla 
4 4   cl4 

На данный момент я вычисляя это следующим образом:

d$classification = unlist(lapply(d$classification, function (x) strsplit(as.character(x), ".", fixed=TRUE)[[1]][1])) 

Это работает, но мне потребовалось некоторое время, чтобы понять это. Я предполагаю, что есть более элегантное решение, которое я, вероятно, пропустил. Какие-либо предложения? Благодаря!

+1

Ваше название темы немного вводит в заблуждение; это не совсем о применении функции к определенному столбцу, а как манипулировать результатами из strsplit. –

ответ

3

Вы можете использовать регулярные выражения с обратными ссылками.

gsub("(.*)\\.(.*)","\\1",d$classification) 

Существует 2 ссылки (части регулярного выражения в скобках), разделенные буквальным периодом. Мы заменяем любые совпадения с шаблоном с содержимым первой ссылки.

+0

Спасибо за это, отличное решение! Не знал, что я могу просто применить регулярное выражение к кадрам данных. – behas

+1

Технически вы применяете регулярное выражение к символьному вектору ('d $ class' не является data.frame). –

11

Немного короче раствор

sapply(strsplit(as.character(d$class), "\\."), `[`, 1) 
2

Просто удалите материал, который следует за "."

> sub("\\..+$", "", d$class) 
[1] "cl1"  "cl2"  "cl3-bla" "cl4" 

d$classification <- sub("\\..+$", "", d$classification) 
# I've never been very comfortable with partial name matching. 
Смежные вопросы