R:读取第n次观察后新行开始的文本文件

时间:2017-12-26 16:14:39

标签: r

以下是我的文本文件的摘录:

df1:
Index   Team 1   Team 2   Team1_Score    Team2_Score
 0       A        B        25              56
 1       B        C        30              55
 2       D        E        35              75

df2:
Index   Team 1   Team 2   Team1_Avg     Team2_Avg
 0       A        B        5              15
 1       G        F        10             25
 2       C        B        15             35

dfcombined
Index   Team 1   Team 2   Team1_Score    Team2_Score    Team2_Avg     Team1_Avg
 0       A        B        25              56           5             15
 1       B        C        30              55           35            15
 2       D        E        35              75        

我想将此文件读入包含4列的数据框中。看起来应该是这样的:

Assets
Notes
2017
2016
Cash
6
12,000,000
11,000,000

我正在考虑循环读取每四个观察一行的新行,但看起来它不是将文件读入R的最有效方法。任何建议?

2 个答案:

答案 0 :(得分:3)

1)base Lines读入角色向量L。在注释的底部,我们可以重复显示Lines,但您可以使用注释掉的行替换读取它的行,并相应地更改文件名。

接下来删除逗号并将其重新整形为n x 4矩阵m。然后将行折叠为字符串向量L2,并使用read.table读取。

没有使用任何包裹。

# L <- readLines("myfile")
L <- readLines(textConnection(Lines))
m <- matrix(gsub(",", "", L),, 4, byrow = TRUE)
L2 <- apply(m, 1, paste, collapse = " ")
read.table(text = L2, header = TRUE, check.names = FALSE, as.is = TRUE)

,并提供:

  Assets Notes     2017     2016
1   Cash     6 12000000 11000000

2)dplyr / tidyr 使用(1)中的L,我们创建一个带有列名(使用回收)和内容的两列数据框,然后将其展开为宽格式。

library(dplyr)
library(tidyr)

L %>%
  { data.frame(Name = factor(.[1:4], levels = .[1:4]),
             Contents = gsub(",", "", .[-(1:4)])) } %>%
  spread(Name, Contents, convert = TRUE)

注意

Lines <- "Assets
Notes
2017
2016
Cash
6
12,000,000
11,000,000"

答案 1 :(得分:1)

data <- structure(list(V1 = c("Assets", "Notes", "2017", "2016", "Cash", 
                            "6", "12,000,000", "11,000,000")), .Names = "V1", class = "data.frame", row.names = c(NA,-8L))

data.frame(matrix(unlist(data), ncol = 4, byrow = T))