我是Stata的长期用户,但我正在努力熟悉R的语法和逻辑。我想知道你是否可以帮助我编写更有效的代码,如下所示(“不那么高效”代码“)
目标是(A)读取几个文件(每个文件代表一年的数据),(B)为每个文件创建相同的变量,(C)将文件合并为一个文件进行统计分析。我已经完成了对“A部分”的修改,但是正在与其他部分进行斗争,尤其是B部分。你能否就如何继续进行一些想法,例如使用unlist
首先取消data.l
,或lapply
取消data.l
的每个元素?感谢您的评论,谢谢。
# Creat an empty list
data.l = list()
# Create a list of file names
fileList=list.files(path="C:/My Data, pattern=".dat")
# Read the ".dat" files into a single list
data.l = sapply(fileList, readLines)
setwd("C:/My Data")
# Part A: Read the data. Each "dat" file is text file and each line in the file has 300 characters.
dx2004 <- readLines("2004.INJVERBT.dat")
dx2005 <- readLines("2005.INJVERBT.dat")
dx2006 <- readLines("2006.INJVERBT.dat")
# Part B-1: Create variables for each year of data
dt2004 <-data.frame(hhx = substr(dx2004,7,12),fmx = substr(dx2004,13,14),
,iphow = substr(dx2004,19,318),stringsAsFactors = FALSE)
dt2005 <-data.frame(hhx = substr(dx2005,7,12),fmx = substr(dx2005,13,14),
,iphow = substr(dx2005,19,318),stringsAsFactors = FALSE)
dt2006 <-data.frame(hhx = substr(dx2006,7,12),fmx = substr(dx2006,13,14),
iphow = substr(dx2006,19,318),stringsAsFactors = FALSE)
# Part B-2: Create the "iid" variable for each year of data
dt2004$iid<-paste0("2004",dt2004$hhx, dt2004$fmx, dt2004$fpx, dt2004$ipepno)
dt2005$iid<-paste0("2005",dt2005$hhx, dt2005$fmx, dt2005$fpx, dt2005$ipepno)
dt2006$iid<-paste0("2006",dt2006$hhx, dt2006$fmx, dt2006$fpx, dt2006$ipepno)
# Part C: Combine the three years of data into a single one
data = rbind(dt2004,dt2005, dt2006)
答案 0 :(得分:1)
考虑这个例子:
test1 = "Thisistextinputnumber1"
test2 = "Thisistextinputnumber2"
test3 = "Thisistextinputnumber3"
data.l = list(test1, test2, test3)
makeDF <- function(inputText){
DF <- data.frame(hhx = substr(inputText, 7, 12), fmx = substr(inputText, 13, 14), iphow = substr(inputText, 19, 318), stringsAsFactors = FALSE)
DF <- within(DF, iid <- paste(hhx, fmx, iphow))
return(DF)
}
do.call(rbind, (lapply(data.l, makeDF)))
此处test1
,test2
,test3
代表您的dx200X,data.l
应该是您从A部分的高效版本获得的列表格式。
在makeDF
中,您可以创建所需的data.frame
。如果您使用do.call(rbind, )
,则lapply
有些标准 - 返回值。
您也可以考虑查看具有函数data.table
的{{1}} - 包,替换任何do.call-rbind构造(并且速度更快),旁边是其他很棒的实用程序大数据集。