转换存储在列表中的数据帧的变量

时间:2015-09-16 20:18:14

标签: r transform lapply

我有一个数据框列表,所有数据框都具有相同的结构,我使用以下代码创建:

myfiles <- list.files(patter='.csv')
mydata <- lapply(myfiles, read.csv)
names(mydata) <- gsub("\\.csv", "", myfiles)

我必须对列表中的每个数据帧运行一系列计算。但首先我必须转换某些变量的数据类型。我已经搜索了高低的答案但仍然很短。我得到的结果是:

lapply(mydata, function(i) {
transform(mydata, PIN=as.character(PIN), Class=as.character(Class), TaxStatus=as.character(TaxStatus), TaxcCode=as.character(TaxCode), TaxRate(as.doublt(TaxRate) *.001), Amt1=(as.double(Amt1) *.01), Amt2=(as.double(Amt2) * .01))
})

但是当我运行这个时,我收到以下错误:

  

data.frame出错(PropTax1993 = list(PIN = c(1011000020000,1011000030000,:     参数意味着行数不同:1443916,1449711,1459247,1469691,1480347,1491574,1504263,1516502,1530584

我认为这是因为我列表中的数据帧有不同的长度。我也试过了:

lapply(1:length(mydata), function(i) {
transform(mydata, PIN=as.character(PIN), Class=as.character(Class), TaxStatus=as.character(TaxStatus), TaxcCode=as.character(TaxCode), TaxRate(as.doublt(TaxRate) *.001), Amt1=(as.double(Amt1) *.01), Amt2=(as.double(Amt2) * .01))
})

......但那也不起作用。我对R(和一般的编程)相对较新。任何援助将不胜感激。

1 个答案:

答案 0 :(得分:0)

这不是最优雅的解决方案,这可能很适用于其中一个应用功能(这对于更优化的解决方案更好),但是这里有一个循环解决方案我刚刚解决了应该做的特技:

# Creating sample data frames (all the same content).
myDF <- data.frame(a = seq(1, 50), b = seq(1, 100, 2) , c = seq(1, 200, 4))
myDF2 <- myDF
myDF3 <- myDF

# Creating a sample list of those data frames.
myList <- list(myDF, myDF2, myDF3)

# The data is in integer form.
print(class(myList[[1]]$a))

# Looping through each data frame in the list and changing each the same way.
for(item in 1:length(myList)) {

  myList[[item]]$a <- as.character(myList[[item]]$a) # Coercing the data type of each column here.
  myList[[item]]$b <- as.character(myList[[item]]$b)
  myList[[item]]$c <- as.character(myList[[item]]$c)

}

# The data is now in character form.
print(class(myList[[1]]$a)) 

只需更改for循环中的列名(a,b和c)以及用于强制列的函数。

还注意到双括号[[1]]符号特别适用于从列表中提取数据。对于矢量或数组,它只是一个支架。