将水平 table 读入 R 中的数据框
Read horizontal table into data frame in R
.txt
文件的格式为:
high_quality 1.2 .9 .7 1.0 1.7 1.7 1.1 .9 1.7 1.9 1.3 2.1 1.6 1.8 1.4 1.3 1.9 1.6 .8 2.0 1.7 1.6 2.3 2.0
poor_quality 1.6 1.5 1.1 2.1 1.5 1.3 1.0 2.6
high_quality行和poor_quality行之间有1个空行。
我试过:
fabric_df = read.table(file="../data2/fabric.txt",sep = " ", header = TRUE)
但出现错误:
“扫描错误(file = file,what = what,sep = sep,quote = quote,dec = dec,:
第 1 行没有 25 个元素
有人知道如何将此文件正确导入数据框吗?
你可以做data.table::fread("file.txt", fill=TRUE)
这会得到
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24
1: 1.2 0.9 0.7 1.0 1.7 1.7 1.1 0.9 1.7 1.9 1.3 2.1 1.6 1.8 1.4 1.3 1.9 1.6 0.8 2 1.7 1.6 2.3 2
2: 1.6 1.5 1.1 2.1 1.5 1.3 1.0 2.6 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
另一种选择是使用 fill = TRUE
和 read.table
。为了可重复性,我在 read.table
中使用 text
读取了您的数据,但您可以对 .txt
文件执行相同的操作。
df <- read.table(text = "high_quality 1.2 .9 .7 1.0 1.7 1.7 1.1 .9 1.7 1.9 1.3 2.1 1.6 1.8 1.4 1.3 1.9 1.6 .8 2.0 1.7 1.6 2.3 2.0
poor_quality 1.6 1.5 1.1 2.1 1.5 1.3 1.0 2.6", fill = TRUE)
# Or read in the .txt file
# df <- read.table("fabric.txt", fill = TRUE)
然后,一旦我们读入数据,我们就可以用 tidyverse
转换它(或在 base R 中,如下所示)。首先,我转置矩阵,然后使用 janitor
中的 row_to_names
将第一行转换为列名。然后,我转换为数据框并将数据类型更改为数字并重置行名称。
library(tidyverse)
library(janitor)
df %>%
t() %>%
row_to_names(row_number = 1) %>%
as.data.frame() %>%
mutate(across(everything(), as.numeric)) %>%
`rownames<-`(., NULL)
或者在 base R 中得到相同的格式:
df <- t(df)
# Make the first row the column names.
colnames(df) <- df[1,]
# Remove the first row with the names.
df <- df[-1,]
# Reset row names.
row.names(df) <- NULL
# Make the columns all numeric.
df1 <- as.data.frame(apply(df, 2, as.numeric))
输出
high_quality poor_quality
1 1.2 1.6
2 0.9 1.5
3 0.7 1.1
4 1.0 2.1
5 1.7 1.5
6 1.7 1.3
7 1.1 1.0
8 0.9 2.6
9 1.7 NA
10 1.9 NA
11 1.3 NA
12 2.1 NA
13 1.6 NA
14 1.8 NA
15 1.4 NA
16 1.3 NA
17 1.9 NA
18 1.6 NA
19 0.8 NA
20 2.0 NA
21 1.7 NA
22 1.6 NA
23 2.3 NA
24 2.0 NA
.txt
文件的格式为:
high_quality 1.2 .9 .7 1.0 1.7 1.7 1.1 .9 1.7 1.9 1.3 2.1 1.6 1.8 1.4 1.3 1.9 1.6 .8 2.0 1.7 1.6 2.3 2.0
poor_quality 1.6 1.5 1.1 2.1 1.5 1.3 1.0 2.6
high_quality行和poor_quality行之间有1个空行。
我试过:
fabric_df = read.table(file="../data2/fabric.txt",sep = " ", header = TRUE)
但出现错误:
“扫描错误(file = file,what = what,sep = sep,quote = quote,dec = dec,: 第 1 行没有 25 个元素
有人知道如何将此文件正确导入数据框吗?
你可以做data.table::fread("file.txt", fill=TRUE)
这会得到
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24
1: 1.2 0.9 0.7 1.0 1.7 1.7 1.1 0.9 1.7 1.9 1.3 2.1 1.6 1.8 1.4 1.3 1.9 1.6 0.8 2 1.7 1.6 2.3 2
2: 1.6 1.5 1.1 2.1 1.5 1.3 1.0 2.6 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
另一种选择是使用 fill = TRUE
和 read.table
。为了可重复性,我在 read.table
中使用 text
读取了您的数据,但您可以对 .txt
文件执行相同的操作。
df <- read.table(text = "high_quality 1.2 .9 .7 1.0 1.7 1.7 1.1 .9 1.7 1.9 1.3 2.1 1.6 1.8 1.4 1.3 1.9 1.6 .8 2.0 1.7 1.6 2.3 2.0
poor_quality 1.6 1.5 1.1 2.1 1.5 1.3 1.0 2.6", fill = TRUE)
# Or read in the .txt file
# df <- read.table("fabric.txt", fill = TRUE)
然后,一旦我们读入数据,我们就可以用 tidyverse
转换它(或在 base R 中,如下所示)。首先,我转置矩阵,然后使用 janitor
中的 row_to_names
将第一行转换为列名。然后,我转换为数据框并将数据类型更改为数字并重置行名称。
library(tidyverse)
library(janitor)
df %>%
t() %>%
row_to_names(row_number = 1) %>%
as.data.frame() %>%
mutate(across(everything(), as.numeric)) %>%
`rownames<-`(., NULL)
或者在 base R 中得到相同的格式:
df <- t(df)
# Make the first row the column names.
colnames(df) <- df[1,]
# Remove the first row with the names.
df <- df[-1,]
# Reset row names.
row.names(df) <- NULL
# Make the columns all numeric.
df1 <- as.data.frame(apply(df, 2, as.numeric))
输出
high_quality poor_quality
1 1.2 1.6
2 0.9 1.5
3 0.7 1.1
4 1.0 2.1
5 1.7 1.5
6 1.7 1.3
7 1.1 1.0
8 0.9 2.6
9 1.7 NA
10 1.9 NA
11 1.3 NA
12 2.1 NA
13 1.6 NA
14 1.8 NA
15 1.4 NA
16 1.3 NA
17 1.9 NA
18 1.6 NA
19 0.8 NA
20 2.0 NA
21 1.7 NA
22 1.6 NA
23 2.3 NA
24 2.0 NA