簡體   English   中英

如何使用lapply添加多個列? [重復]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM