2015-06-29 4 views
2

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

Итак, если столбец содержит 0, 1, 1, 0, я хочу сделать это «нет», «да», «да», «нет».

Я попытался

df$C0 <- ifelse(df$C0 == 0, "no", "yes) 

, но это просто дает мне

Error in as.logical(from) : 
    cannot coerce type 'S4' to vector of type 'logical' 

Как бы идти о том, чтобы это обновление?

P.S. Я на основе вышеуказанной попытки на то, что это работает:

df$C0 <- df$C0 + 1 
+0

На самом деле, источником проблемы является 'ifelse' и не колонного типа. – zero323

+0

Если есть другой способ добраться до решения, я рад его использовать. – dommer

+0

Лучше всего я могу придумать простой SQL-запрос. Скорее всего, существует какой-то более чистый метод, но некоторые функции вообще не работают на моей установке (например, «mutate»), и насколько я могу судить, нет никакого способа определить литерал вообще. – zero323

ответ

3

Вероятно, самым простым решением здесь является использование SQL:

# Because it is hard to live without pipes 
library(magrittr) 

# Create sqlContext 
sqlContext <- sparkRSQL.init(sc) 
sqlContext <- SQLContext(sc) 

# Register table 
registerTempTable(df, 'df') 

# Query 
sql(sqlContext, "SELECT *, IF(C0 = 0, 'yes', 'no') AS C0 FROM df") %>% showDF() 

К сожалению, это создает дубликат имя, так что, вероятно, переименовать существующий первый :

df <- df %>% withColumnRenamed(existingCol = 'C0', newCol = 'CO_old') 
registerTempTable(df, 'df') 
sql(sqlContext, "SELECT *, IF(C0_old = 0, 'yes', 'no') AS C0 FROM df") 

или просто заменить * со списком столбцов вам нужно.

Также можно использовать when/otherwise:

df %>% select(when(df$C) == 0, 'yes') %>% otherwise('no')) 
Смежные вопросы