来自单个列中多个变量的数据,如何修复? - R数据帧

时间:2016-04-15 15:45:41

标签: r dataframe tidyr

我获得了几百个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个不同长度的数据帧。

2 个答案:

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