将水平 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 = TRUEread.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