【发布时间】:2018-08-16 16:08:53
【问题描述】:
我一直在绞尽脑汁想弄清楚如何减少所需的代码量
- 将数据帧列表中的一列从整数更改为字符
- 为所有数据框设置一个 data.table 键
- 根据数据框名称向一组数据框添加一列常量
这是我的代码。我知道必须有更好的方法。
将列从整数修改为字符
MERGED1996.97.PP$OPEID<-as.character(MERGED1996.97.PP$OPEID)
MERGED1997.98.PP$OPEID<-as.character(MERGED1997.98.PP$OPEID)
MERGED1998.99.PP$OPEID<-as.character(MERGED1998.99.PP$OPEID)
MERGED1999.00.PP$OPEID<-as.character(MERGED1999.00.PP$OPEID)
MERGED2000.01.PP$OPEID<-as.character(MERGED2000.01.PP$OPEID)
MERGED2001.02.PP$OPEID<-as.character(MERGED2001.02.PP$OPEID)
MERGED2002.03.PP$OPEID<-as.character(MERGED2002.03.PP$OPEID)
MERGED2003.04.PP$OPEID<-as.character(MERGED2003.04.PP$OPEID)
MERGED2004.05.PP$OPEID<-as.character(MERGED2004.05.PP$OPEID)
MERGED2005.06.PP$OPEID<-as.character(MERGED2005.06.PP$OPEID)
MERGED2006.07.PP$OPEID<-as.character(MERGED2006.07.PP$OPEID)
MERGED2007.08.PP$OPEID<-as.character(MERGED2007.08.PP$OPEID)
MERGED2008.09.PP$OPEID<-as.character(MERGED2008.09.PP$OPEID)
MERGED2009.10.PP$OPEID<-as.character(MERGED2009.10.PP$OPEID)
MERGED2010.11.PP$OPEID<-as.character(MERGED2010.11.PP$OPEID)
MERGED2011.12.PP$OPEID<-as.character(MERGED2011.12.PP$OPEID)
MERGED2012.13.PP$OPEID<-as.character(MERGED2012.13.PP$OPEID)
MERGED2013.14.PP$OPEID<-as.character(MERGED2013.14.PP$OPEID)
MERGED2014.15.PP$OPEID<-as.character(MERGED2014.15.PP$OPEID)
MERGED2015.16.PP$OPEID<-as.character(MERGED2015.16.PP$OPEID)
设置键
setkey(MERGED199<-, "OPEas.character(
setkey(MERGED199<-, "OPEas.character(
setkey(MERGED199<-, "OPEID")
setkey(MERGED1999.00.PP, "OPEID")
setkey(MERGED2000.01.PP, "OPEID")
setkey(MERGED2001.02.PP, "OPEID")
setkey(MERGED2002.03.PP, "OPEID")
setkey(MERGED2003.04.PP, "OPEID")
setkey(MERGED2004.05.PP, "OPEID")
setkey(MERGED2005.06.PP, "OPEID")
setkey(MERGED2006.07.PP, "OPEID")
setkey(MERGED2007.08.PP, "OPEID")
setkey(MERGED2008.09.PP, "OPEID")
setkey(MERGED2009.10.PP, "OPEID")
setkey(MERGED2010.11.PP, "OPEID")
setkey(MERGED2011.12.PP, "OPEID")
setkey(MERGED2012.13.PP, "OPEID")
setkey(MERGED2013.14.PP, "OPEID")
setkey(MERGED2014.15.PP, "OPEID")
setkey(MERGED2015.16.PP, "OPEID")
添加列
MERGED1996.97.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED1996.97.PP))), 9,12)]
MERGED1997.98.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED1997.98.PP))), 9,12)]
MERGED1998.99.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED1998.99.PP))), 9,12)]
MERGED1999.00.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED1999.00.PP))), 9,12)]
MERGED2000.01.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2000.01.PP))), 9,12)]
MERGED2001.02.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2001.02.PP))), 9,12)]
MERGED2002.03.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2002.03.PP))), 9,12)]
MERGED2003.04.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2003.04.PP))), 9,12)]
MERGED2004.05.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2004.05.PP))), 9,12)]
MERGED2005.06.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2005.06.PP))), 9,12)]
MERGED2006.07.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2006.07.PP))), 9,12)]
MERGED2007.08.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2007.08.PP))), 9,12)]
MERGED2008.09.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2008.09.PP))), 9,12)]
MERGED2009.10.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2009.10.PP))), 9,12)]
MERGED2010.11.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2010.11.PP))), 9,12)]
MERGED2011.12.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2011.12.PP))), 9,12)]
MERGED2012.13.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2012.13.PP))), 9,12)]
MERGED2013.14.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2013.14.PP))), 9,12)]
MERGED2014.15.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2014.15.PP))), 9,12)]
MERGED2015.16.PP[, ay :=substr(gsub("\\.","",deparse(substitute(MERGED2015.16.PP))), 9,12)]
chinsoon12 的代码效果很好。现在我需要更改列名。我加了
colnames(df)[1] <- "UNITID"
到代码
lapply(dfLs, function(nm) {
df <- get(nm)
setDT(df)[, OPEID := as.character(OPEID)]
setkeyv(df, "OPEID")
colnames(df)[1] <- "UNITID"
df[, ay := substr(gsub("\\.", "", nm), 9, 12)]
})
但它不会修改第一列的名称。非常感谢任何建议。
谢谢。
【问题讨论】:
-
尝试
purrr::map(list_of_dataframes, ~as.character(.x$OPEID))将列从整数更改为字符。那应该遍历数据框并进行调整。然后可能是purrr::map(list_of_dataframes, ~setkey(.x, "OPEID"))的键。 -
使用
dplyr::mutate_at在位置进行变异,或dplyr::mutate_if用于基于谓词的变异 -
最后,
purrr::map(list_of_dataframes, ~.x[, ay :=substr(gsub("\\.","",deparse(substitute(.x))), 9,12)])更改列。虽然没有数据,但我实际上无法对此进行测试。
标签: r dplyr data.table apply