Один параметр для конкатенации строковых столбцов в Spark Scala использует concat
.
Нужно проверить нулевые значения. Потому что, если один из столбцов имеет значение NULL, результат будет нулевым, даже если один из столбцов имеет информацию.
Используя concat
и withColumn
:
val newDf = df.withColumn("NEW_COLUMN", concat(when(col("COL1").isNotNull,col("COL1")).otherwise(lit("null"), when(col("COL2").isNotNull,col("COL2")).otherwise(lit("null")))
Используя concat
и select
:
val newDf = df.selectExpr("concat(nvl(COL1, ''), nvl(COL2, '')) as NEW_COLUMN")
В обоих подходах вы будете иметь NEW_COLUMN, значение которого представляет собой конкатенацию столбцов: COL1 и COL2 из вашего исходного df.
Если переменная Date
является фактическим вектором класса yearmon
, из пакета zoo метод as.Date.yearmon
может делать то, что вы хотите, через свой аргумент frac
.
Используя ваши данные , и предположив, что Date
был первоначально символьным вектором
library("zoo")
df <- data.frame(Date = c("2014-07", "2014-08", "2014-09"),
Arrivals = c(100, 150, 200))
, я преобразую это в вектор yearmon
:
df <- transform(df, Date2 = as.yearmon(Date))
Предполагая, что это то, что у вас есть, то вы можете достичь того, что хотите, используя as.Date()
с frac = 1
:
df <- transform(df, Date3 = as.Date(Date2, frac = 1))
, который дает:
> df
Date Arrivals Date2 Date3
1 2014-07 100 Jul 2014 2014-07-31
2 2014-08 150 Aug 2014 2014-08-31
3 2014-09 200 Sep 2014 2014-09-30
Это показывает отдельные шаги. Если вы хотите, чтобы конечный Date
был однострочным
## assuming `Date` is a `yearmon` object
df <- transform(df, Date = as.Date(Date, frac = 1))
## or if not a `yearmon`
df <- transform(df, Date = as.Date(as.yearmon(Date), frac = 1))
Аргумент frac
во фракции месяца, чтобы назначить результирующие даты при преобразовании из объектов yearmon
в Date
объектов. Следовательно, чтобы получить первый день месяца, а не конвертировать в символ и вставить на "-01"
, как показал ваш вопрос, лучше принудить Date
объект к frac = 0
.
Если Date
в вашем df
не является объектом класса yearmon
, тогда вы можете решить свою проблему, переведя его в один, а затем используя метод as.Date()
, как описано выше.
Используя lubridate
, вы можете добавить месяц и вычесть день, чтобы получить последний день месяца:
library(lubridate)
ymd(paste0(df$Date, '-01')) + months(1) - days(1)
# [1] "2014-07-31" "2014-08-31" "2014-09-30"
Вот способ сделать это, используя пакет zoo.
R-код:
library(zoo)
df
# Date Arrivals
# 1 2014-07 100
# 2 2014-08 150
# 3 2014-09 200
df$Date <- as.Date(as.yearmon(df$Date), frac = 1)
# output
# Date Arrivals
# 1 2014-07-31 100
# 2 2014-08-31 150
# 3 2014-09-30 200