我获得了几百个excel文件,其中数据存储在"风格化"格式。当我将文件批量转换为.csv并读入相关行时,单个文件中的数据如下所示:
data.frame(x1= c("year", "2014", "site", "28",NA,NA), x2= LETTERS[1:6])
x1 x2
1 year A
2 2014 B
3 site C
4 28 D
5 <NA> E
6 <NA> F
我希望它看起来像这样:
data.frame(year= rep("2014",6), site= rep("28",6), x2= LETTERS[1:6])
year site x2
1 2014 28 A
2 2014 28 B
3 2014 28 C
4 2014 28 D
5 2014 28 E
6 2014 28 F
如您所见,有两个变量名称(年份和站点)及其数据(&#34; 2014&#34;和#34; 28&#34;)存储在一个列中。 (变量数据始终位于变量名后面的行中。)数据框中的其他变量(在本例中为x2)的格式正确。
我可以就如何有效地将这些变量放入自己的列中提出一些建议吗?我需要在rbind
之前将解决方案应用于大约100个不同长度的数据帧。
答案 0 :(得分:2)
在基地R:
coef(m)[-1]
coef(m2)[2] + c(0, coef(m2)[-(1:2)])
> coef(m)[-1]
log(v1269):age1 log(v1269):age2 log(v1269):age3 log(v1269):age4
0.20127109 -0.01431491 -0.02588106 0.06018802
> coef(m2)[2] + c(0, coef(m2)[-(1:2)])
log(v1269):age2 log(v1269):age3 log(v1269):age4
0.20127109 -0.01431491 -0.02588106 0.06018802
制作几个索引:
df <- data.frame(x1= c("year", "2014", "site", "28",NA,NA), x2= LETTERS[1:6], stringsAsFactors = FALSE)
获取他们的价值,
year_idx <- which(df$x1 == "year")
site_idx <- which(df$x1 == "site")
使用新值制作新列:
year <- df$x1[year_idx +1]
site <- df$x1[site_idx +1]
重新整理:
df["year"] <- year
df["site"] <- site
答案 1 :(得分:1)
只要格式在文件中是一致的(大的if),你可以编写代码来清理一个文件,把它放在一个函数中,然后使用`lapply(files,myFunction)来读取所有文件一个列表。在您的示例中,为方便起见,命名为df:
# code to clean data
newdf <- data.frame("year"=df$x1[2], "site"=df$x1[4], "x2"=df$x2)
# wrap this in a function together with read.csv
myFunction <- function(infile) {
df <- read.csv(infile, as.is=T)
newdf <- data.frame("year"=df$x1[2], "site"=df$x1[4], "x2"=df$x2)
return(newdf)
}
然后使用lapply
fileList <-list.files(<path>)
# new df names, remove .csv or .xlsx extensions, you may need to do a bit more
dfNames <- gsub("\\..*$", "", fileList)
# get a list of the data.frames
dataList <- lapply(fileList, myFunction)