如何有效地为列表的每个元素创建相同的变量?

时间:2016-01-26 14:50:31

标签: r list

我是Stata的长期用户,但我正在努力熟悉R的语法和逻辑。我想知道你是否可以帮助我编写更有效的代码,如下所示(“不那么高效”代码“)

目标是(A)读取几个文件(每个文件代表一年的数据),(B)为每个文件创建相同的变量,(C)将文件合并为一个文件进行统计分析。我已经完成了对“A部分”的修改,但是正在与其他部分进行斗争,尤其是B部分。你能否就如何继续进行一些想法,例如使用unlist首先取消data.l,或lapply取消data.l的每个元素?感谢您的评论,谢谢。

更高效的代码:A部分

# 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) 

效率不高的代码:A,B和C部分

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)

1 个答案:

答案 0 :(得分:1)

你快到了。它是lapply和do.call/rbind的组合,可以与lapply的列表输出一起使用。

考虑这个例子:

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)))

此处test1test2test3代表您的dx200X,data.l应该是您从A部分的高效版本获得的列表格式。

makeDF中,您可以创建所需的data.frame。如果您使用do.call(rbind, ),则lapply有些标准 - 返回值。

您也可以考虑查看具有函数data.table的{​​{1}} - 包,替换任何do.call-rbind构造(并且速度更快),旁边是其他很棒的实用程序大数据集。