2015-02-25 4 views
0

Извините помехообразующих с этим ломом, но я понятия не имею, что это неправильно ...Работа с символами в R

Мой кадр данных, кажется, как показано ниже:

DF <- data.frame(user = c(1,2,3,4,5), sentence1 = c("hl",NA,"hel","helllo",NA),sentence2 = c("hi",NA,"cheers",NA, NA)) 

И у меня есть функция, которая удаляет строки в DF, если NCHAR в SENTENCE1 менее 3 ...

Функция:

TooLong <- function(sentences) { 
    for (i in 1:nrow(sentences)) { 
    if (nchar(as.character(sentences[i,2])) < 3) {sentences[i,] <- sentences[i,]} 
    else {sentences[-i,]} 
    } 
    sentences 
} 

И призыв:

DF <- TooLong(DF) 

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

+0

Что значит "не работает" значит для вас? Какой результат вы ожидаете от желаемого ввода. Опишите в словах, что вы ожидаете от своей функции. – MrFlick

+0

Да, мне. Я ожидаю, что функция удалит строку, где nchar (DF $ предложение1) <3. Итак, DF без 1., 2. и 5 строк :-) – martinkabe

+0

'DF [grepl ('^. {3,} $', DF $ предложение1),]' – hwnd

ответ

0

Вы можете сделать это полностью с Подменю:

DF[nchar(as.character(DF$sentence1))>=3,] 
    user sentence1 sentence2 
3 3  hel cheers 
4 4 helllo  <NA> 

Ошибка в функции является то, что он не делает замену в пункте другого. Даже если это произошло, потому что он пытается изменить данные на месте, он считает, что индексы будут перепутаны. Цикл while был бы лучше.

+0

Но если я разбил все части этой функции и попробую, например. DF [-2,], когда условие FALSE должно работать, но это не так. Мне просто любопытно, как эта функция должна выглядеть корректно ... – martinkabe

+0

Вам понадобится что-то вроде '{предложения <- предложения [-i]; i <- i-1} '. Значение 'i' уменьшается, потому что вы удалили строку. Но, как я сказал, цикл 'for' не будет работать с такой конструкцией. – James

+0

Собственно, вы могли бы сделать это с помощью цикла for, если бы вы работали в обратном порядке, поскольку это позволило бы избежать переупорядочения проблемы с данными. – James

1

простое решение, на мой взгляд

subset(DF, nchar(as.character(sentence1)) > 3)

+1

Я думаю, вы хотели бы иметь его как '> = 3', чтобы сохранить правильные данные. – James

+0

Отлично, он отлично работает :-), большое спасибо ... И вам, случается, знать, что не так в моем подходе? Я имею в виду в своей функции. – martinkabe

+1

Это отвратительно во всех отношениях, и самый худший способ обработки данных в R. Проверьте http://www.burns-stat.com/pages/Tutor/R_inferno.pdf#page=18 – geotheory

0

Вы можете попробовать:

library(dplyr); DF %>% filter(!nchar(as.character(sentence1)) < 3) 
+0

Большое спасибо всем, отличная работа ... – martinkabe

0
DF[,2:3]<-lapply(DF[,2:3],as.character) #convert sentence 1 and sentence 3 into character 
DF[nchar(DF[,2])>=nchar(DF[,3]),] 
    user sentence1 sentence2 
1 1  hl  hi 
2 2  <NA>  <NA> 
4 4 helllo  <NA> 
5 5  <NA>  <NA> 
Смежные вопросы