将 xlsx 文件中的水平(基于行)数据读入 R 数据帧
Reading horizontal (row-based) data from xlsx files into R data frames
这是一个 "let's try another way" post 与 this one:
是否可以 define/modify 一个
的阅读功能
可以处理存储在xlsx
文件中的数据是基于行的这一事实(即每一行代表一个变量)
并相应地对其进行转换,以便它可以存储在基于 列的 data.frame
中(即以前的 [=33= xlsx
中的行 变为 列)
同时 捕获基于行的变量的基础 class/data 类型?
关于 csv
文件,我可能会从转向 readLines
开始,但不幸的是 xlsx
对我来说仍然是一个黑匣子。
这是一个小 xlsx
文件,其中包含两个数据方向的示例:https://github.com/rappster/Whosebug/blob/master/excel/row-and-column-based-data.xlsx
> 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"
如何稍微修改 xlsx
包中的 read.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
您也可以尝试使用此代码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 sheet 在第二列中有所需的 列 headers,这意味着它们最终排在第一行,然后我用 janitor 和描述的方法 here
修复了它
x %>%
row_to_names(row_number = 1)
这是一个 "let's try another way" post 与 this one:
是否可以 define/modify 一个
的阅读功能可以处理存储在
xlsx
文件中的数据是基于行的这一事实(即每一行代表一个变量)并相应地对其进行转换,以便它可以存储在基于 列的
data.frame
中(即以前的 [=33=xlsx
中的行 变为 列)同时 捕获基于行的变量的基础 class/data 类型?
关于 csv
文件,我可能会从转向 readLines
开始,但不幸的是 xlsx
对我来说仍然是一个黑匣子。
这是一个小 xlsx
文件,其中包含两个数据方向的示例:https://github.com/rappster/Whosebug/blob/master/excel/row-and-column-based-data.xlsx
> 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"
如何稍微修改 xlsx
包中的 read.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
您也可以尝试使用此代码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 sheet 在第二列中有所需的 列 headers,这意味着它们最终排在第一行,然后我用 janitor 和描述的方法 here
修复了它x %>%
row_to_names(row_number = 1)