将xlsx文件中的水平(基于行)数据读入R数据帧

时间:2016-02-05 21:41:28

标签: r excel dataframe xlsx transpose

这是与this one相关的“让我们尝试另一种方式”的帖子:

是否可以定义/修改

的阅读功能
  • 可以处理存储在data.frame文件中的数据基于行的事实(即每行代表一个变量)

  • 并相应地对其进行转换,以便将其存储在基于列的 xlsx中(即{{>>行中的{em>行) 1}}成为

  • 捕获基于行的变量的基础类/数据类型

关于csv文件,我可能会转向readLines,但不幸的是xlsx对我来说仍然是一个黑盒子。

这是一个小xlsx文件,其中包含两个数据方向的示例:https://github.com/rappster/stackoverflow/blob/master/excel/row-and-column-based-data.xlsx

3 个答案:

答案 0 :(得分:2)

如何稍微修改read.xlsx包中的xlsx函数:

library(xlsx)
read.transposed.xlsx <- function(file,sheetIndex) {
        df <- read.xlsx(file, sheetIndex = sheetIndex , header = FALSE)
        dft <- as.data.frame(t(df[-1]), stringsAsFactors = FALSE) 
        names(dft) <- df[,1] 
        dft <- as.data.frame(lapply(dft,type.convert))
        return(dft)            
}

# Let's test it
read.transposed.xlsx("row-and-column-based-data.xlsx", sheetIndex = 2)
#    variable var_1 var_2 var_3
#1 2016-01-01     1     a  TRUE
#2 2016-01-02     2     b FALSE
#3 2016-01-03     3     c  TRUE

答案 1 :(得分:1)

   > library(openxlsx)
> library(reshape)
> x=read.xlsx("row-and-column-based-data.xlsx",sheet = 2);
> x
  variable 2016-01-01 2016-01-02 2016-01-03
1    var_1          1          2          3
2    var_2          a          b          c
3    var_3       TRUE      FALSE       TRUE
> y=t(x)
> colnames(y)=y[1,]
> y=y[2:nrow(y),]
> cc=data.frame(y, stringsAsFactors = F)
> cc
           var_1 var_2 var_3
2016-01-01     1     a  TRUE
2016-01-02     2     b FALSE
2016-01-03     3     c  TRUE
> sapply(cc, class)
      var_1       var_2       var_3 
"character" "character" "character" 
> write.csv(cc,"temp.csv")
> bb=read.csv("temp.csv")  #infer magically types
> bb
           X var_1 var_2 var_3
1 2016-01-01     1     a  TRUE
2 2016-01-02     2     b FALSE
3 2016-01-03     3     c  TRUE
> sapply(bb, class)
        X     var_1     var_2     var_3 
 "factor" "integer"  "factor" "logical" 

或使用stringsAsFactors = F如果您更喜欢字符数据类型:

> bb=read.csv("temp.csv", stringsAsFactors = F)  #infer magically types
> bb
           X var_1 var_2 var_3
1 2016-01-01     1     a  TRUE
2 2016-01-02     2     b FALSE
3 2016-01-03     3     c  TRUE
> sapply(bb, class)
          X       var_1       var_2       var_3 
"character"   "integer" "character"   "logical" 

答案 2 :(得分:1)

您也可以使用此代码尝试utility

install.packages("remotes")
remotes::install_github("atusy/mytools")
library(mytools)
my_df <- read_excel2("my_excel_file.xlsx", sheet = 1, transposing = TRUE, error_as_NA = TRUE, rm_blank_col = TRUE)

我的excel工作表在第二列中具有所需的 column 标头,这意味着它们最终出现在第一行中,然后我使用 janitor 将该方法固定描述了here

x %>%
  row_to_names(row_number = 1)