我有一个SparkR数据框,其中所有列都是整数。我想用字符串替换一列。
所以,如果列包含0,1,1,0,我想要“no”,“yes”,“yes”,“no”。
我试过
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 :(得分: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'))