[英]How to add multiple columns using lapply? [duplicate]
这个问题已经在这里有了答案:
我有一个数据表,如下所示:
dt=data.table(
id=c(1,2,3,4,5,6),
date=c("28 Jul 2009","31 Jul 2009","31 Jul 2009","04 Aug 2009","10 Aug 2009","06 Aug 2009")
)
我想在此列中增加三列日,月,年。
dt[,day:=unlist(strsplit(date,"\\ "))[1]]
dt[,month:=unlist(strsplit(date,"\\ "))[2]]
dt[,year:=unlist(strsplit(date,"\\ "))[3]]
但这只是将所有具有相同拆分的列附加到第一行。
所以我尝试了
dt[,day:=lapply(date,function (x) {unlist(strsplit(x,"\\ "))[1]}),]
dt[,month:=lapply(date,function (x) {unlist(strsplit(x,"\\ "))[2]}),]
dt[,year:=lapply(date,function (x) {unlist(strsplit(x,"\\ "))[3]}),]
起作用了。 但是如何将所有内容合并为一行而不是3行以及其他任何efficeint方法。
您还需要数据表包中的tstrsplit()
。 在help(tstrsplit)
, “使用strsplit
拆分列并将转置结果分配给各个列是一种便捷的包装函数”。
dt[, c("day", "month", "year") := tstrsplit(date, " ")]
dt
# id date day month year
# 1: 1 28 Jul 2009 28 Jul 2009
# 2: 2 31 Jul 2009 31 Jul 2009
# 3: 3 31 Jul 2009 31 Jul 2009
# 4: 4 04 Aug 2009 04 Aug 2009
# 5: 5 10 Aug 2009 10 Aug 2009
# 6: 6 06 Aug 2009 06 Aug 2009
您可以使用库lubridate和dplyr轻松完成此操作
library(data.table)
dt=data.table(
id=c(1,2,3,4,5,6),
date=c("28 Jul 2009","31 Jul 2009","31 Jul 2009","04 Aug 2009","10 Aug 2009","06 Aug 2009")
)
str(dt)
library(lubridate)
dt$date<- dmy(dt$date)
library(dplyr)
mutate(dt, day= day(dt$date),month = month(dt$date),year = year(dt$date))
问题是您的[1]
索引采用18个元素中的第一个,而不是6个元素列表中的每个。
dt[,day := sapply(strsplit(date, "\\s"), `[[`, 1),]
dt
# id date day
# 1: 1 28 Jul 2009 28
# 2: 2 31 Jul 2009 31
# 3: 3 31 Jul 2009 31
# 4: 4 04 Aug 2009 04
# 5: 5 10 Aug 2009 10
# 6: 6 06 Aug 2009 06
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.