ifelse возвращает только числовое значение - PullRequest
3 голосов
/ 27 апреля 2019

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

Я пытался найти ответ в Интернете, но не могу найти ответ

dataframe$newcol <- ifelse(dataframe$colA == "London", dataframe$colA, dataframe$colB)'

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019

R по умолчанию много символьных столбцов для факторов, которые могут быть немного сложнее.

Вы можете посмотреть на класс переменных вот так

sapply( dataframe, class )

или

str( dataframe )

Вы можете конвертировать несколько столбцов следующим образом:

dataframe[ , c("colA" ,"colB") ] <- sapply( dataframe[ , c("colA" ,"colB") ] , as.character )

вы можете конвертировать один столбец за один раз, как это

dataframe$colA <- as.character( dataframe$colA )

если вы конвертируете числовые столбцы, делайте это так

dataframe$colX <- as.numeric( as.character( dataframe$colX ))

Ваш код должен работать сейчас - обратите внимание, что я изменил == на% в%

dataframe$newcol <- ifelse(dataframe$colA %in% "London", dataframe$colA, dataframe$colB)

вы можете сэкономить, набирая текст с помощью преобразования здесь

dataframe <- transform( dataframe , newcol = ifelse( colA %in% "London", colA, colB))
0 голосов
/ 27 апреля 2019

Вы можете написать небольшую новую функцию ifelse.fac для этой цели.

ifelse.fac <- Vectorize(function(x, y, z) if (x) y else z)

Применение к выходам данных:

dat$newcol <- ifelse.fac(dat$colA == "London", dat$colA, dat$colB)
dat
#         colA          colB    newcol
# 1     London not in France    London
# 2     London not in France    London
# 3     London not in France    London
# 4     London not in France    London
# 5      Paris     in France in France
# 6  Marseille     in France in France
# 7      Paris     in France in France
# 8      Paris     in France in France
# 9     London not in France    London
# 10 Marseille     in France in France

И структура факторов остается неизменной:

str(dat)
# 'data.frame': 10 obs. of  3 variables:
# $ colA  : Factor w/ 3 levels "London","Marseille",..: 1 1 1 1 3 2 3 3 1 2
# $ colB  : Factor w/ 2 levels "in France","not in France": 2 2 2 2 1 1 1 1 2 1
# $ newcol: Factor w/ 5 levels "London","Marseille",..: 1 1 1 1 4 4 4 4 1 4

Данные

dat <- structure(list(colA = structure(c(1L, 1L, 1L, 1L, 3L, 2L, 3L, 
3L, 1L, 2L), .Label = c("London", "Marseille", "Paris"), class = "factor"), 
    colB = structure(c(2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 1L
    ), .Label = c("in France", "not in France"), class = "factor")), row.names = c(NA, 
-10L), class = "data.frame")

head(dat)
#        colA          colB
# 1    London not in France
# 2    London not in France
# 3    London not in France
# 4    London not in France
# 5     Paris     in France
# 6 Marseille     in France
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...