Как преобразовать столбец с помощью цикла for - PullRequest
2 голосов
/ 17 апреля 2019

Я пытаюсь преобразовать названия продуктов Amazon в определенные категории и заменить исходные значения в моем фрейме данных. Как мне это сделать?

У меня уже есть код регулярного выражения и цикл for, который может найти и напечатать преобразование, но у меня возникают проблемы при замене исходных значений в столбце. У меня также есть вложенный цикл for, который, кажется, работает, но он только правильно трансформирует и заменяет одну из категорий (Kindle). Я думаю, что мои условия отдыха не работают так, как мне бы хотелось.

Код для определения категории:

fire = unique(grep('^[^Certified].*Fire TV', amz$name, value=TRUE))
kindle = unique(grep('^[^Certified]*Kindle', amz$name, value=TRUE))
echo = unique(grep('[^Certified].*Echo', amz$name, value=TRUE))
tap = unique(grep('[^Certified].*Tap', amz$name, value=TRUE))
tablet = unique(grep('^[^Certified].*Tablet', amz$name, value=TRUE))
refurb = unique(grep('^Certified', amz$name, value=TRUE))

Код для преобразования и печати Категории:

for (x in amz$name){
        if(x %in% fire
        ){print('Fire TV')} else if(x %in% kindle
        ){print('Kindle')} else if(x %in% echo
        ){print('Echo')} else if(x %in% tap
        ){print('Tap')} else if(x %in% tablet
        ){print('Tablet')} else if(x %in% refurb
        ){print('Certified Refurbished')} else {
                                print('Misc')
                            }
                        }

Код, пытающийся заменить исходные значения:

for (i in 1:nrow(amz)){
    for (x in amz$name[i]){
        if(x %in% fire
            ){(amz$name[i] <- 'Fire TV') 
                break} else if(x %in% kindle
            ){(amz$name[i] <- 'Kindle') 
                break} else if(x %in% echo
            ){(amz$name[i] <- 'Echo') 
                break} else if(x %in% tap
            ){(amz$name[i] <- 'Tap') 
                break} else if(x %in% tablet
            ){(amz$name[i] <- 'Tablet') 
                break} else if(x %in% refurb
            ){(amz$name[i] <- 'Certified Refurbished') 
                break} else {(amz$name[i] <- 'Misc') 
                    break
        }
    }
}

Во внутреннем цикле я ожидаю, что код проверяет, находится ли x в первом списке, а если нет, то перемещается к следующему, пока не найдет список, к которому он принадлежит, и не войдет в категорию в amz $ name [ я]. Как только он найден и введен, я хочу, чтобы внутренний цикл разорвался, а внешний цикл перешел на вторую итерацию, i = 2. Пока что это только правильно для первой категории, остальные категории возвращают NA. Я должен сказать, что продукт на amz $ name [1] - это Kindle Paperwhite. Так что, кажется, выборочная классификация продуктов Kindle.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Спасибо @divibisan и @FlyingPickle! Используя mutate и ifelse, я смог найти решение для моей проблемы.

amz <- mutate(amz, newCat = 
    ifelse(name %in% fire,
    'Amazon Fire TV', 
            ifelse(name %in% kindle,
            'Amazon Kindle',
                ifelse(name %in% echo,
                'Amazon Echo',
                    ifelse(name %in% tap,
                    'Amazon Tap',
                        ifelse(name %in% tablet,
                        'Amazon Tablet',
                            ifelse(name %in% refurb,
                            'Certified Refurbished',
                            'Misc.'

                )))))))
0 голосов
/ 17 апреля 2019

Я предполагаю, что данные находятся во фрейме данных, затем вы можете проверить оператор ifelse.

Обратите внимание, вы должны использовать несколько операторов ifelse, но они векторизованы и будут работать быстрее по сравнению с циклом forдля больших наборов данных.

ifelse(x %in% 'fire', "Fire TV", ifelse(x %in% 'Kindle', "Kindle", ifelse(x %in% 'alex', "Alexa", "Misc")))

Выше написано для 3 случаев, вы можете настроить соответственно для большего количества случаев ... Один пример ниже ...

> x="alex"
> ifelse(x %in% 'fire', "Fire TV", ifelse(x %in% 'Kindle', "Kindle", ifelse(x %in% 'alex', "Alexa", "Misc")))
[1] "Alexa"
> x="mango"
> ifelse(x %in% 'fire', "Fire TV", ifelse(x %in% 'Kindle', "Kindle", ifelse(x %in% 'alex', "Alexa", "Misc")))
[1] "Misc"
> x=rbind("alex","mango")
> ifelse(x %in% 'fire', "Fire TV", ifelse(x %in% 'Kindle', "Kindle", ifelse(x %in% 'alex', "Alexa", "Misc")))
[1] "Alexa" "Misc" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...