将txt文件与Xlsx文件进行比较

时间:2018-10-31 17:40:32

标签: r excel

R的新手,并尝试充分利用它。这项任务每周需要完成多次。

在工作中,我们得到一个包含以下数据的SAS代码文本文件:

            1,2,3,201,202,203 = "Screening"
            101,102,301,302,404,405,1001= "Cycle 1 Day 1"
            1002 = "Cycle 1 Day 2"
            1003 = "Cycle 1 Day 3"
            103,104,303,304,407,408,409,410 = "Cycle 1 Day 8"
            105,106,305,306,412,413 = "Cycle 1 Day 15"
            107,108,307,308,414,415,416,417,1022= "Cycle 1 Day 22"
            1023 = "Cycle 1 Day 23"
            1024 = "Cycle 1 Day 24"
            109,110,309,310,418,419,420,421,2001 = "Cycle 2 Day 1"
            2002= "Cycle 2 Day 2"
            2003= "Cycle 2 Day 3"
            111,112,422,423 = "Cycle 2 Day 8"
            113,114,311,312,424,425 = "Cycle 2 Day 15"
            115,116,426,427= "Cycle 2 Day 22"
            117,118,119,313,314,315 = "Cycle 2 End of Cycle"
            120,121,316,317,430,431 = "Cycle 3 Day 1"
            122,123,432,433 = "Cycle 3 Day 8"
            124,125,318,319,434,435 = "Cycle 3 Day 15"
            126,127,436,437 = "Cycle 3 Day 22"
            128,129,320,321,438,439 = "Cycle 4 Day 1"

我也有一个包含以下内容的Excel文件:

Visit No    Vis Label
1   Screening Day -14 to -1
2   Screening Day -14 to -1
3   Screening Day -14 to -1
101 Cycle 1 Day 1 to 3
102 Cycle 1 Day 1 to 3
103 Cycle 1 Day 8     
104 Cycle 1 Day 8     
105 Cycle 1 Day 15     
106 Cycle 1 Day 15     
107 Cycle 1 Day 22     
108 Cycle 1 Day 22     
109 Cycle 2 Day 1     
110 Cycle 2 Day 1     
111 Cycle 2 Day 8     
112 Cycle 2 Day 8     
113 Cycle 2 Day 15     
114 Cycle 2 Day 15     
115 Cycle 2 Day 22     
116 Cycle 2 Day 22     
117 Cycle 2 End of Cycle
118 Cycle 2 End of Cycle
119 Cycle 2 End of Cycle

现在,我必须将SAS代码txt文件与Excel进行比较,并记下SAS文件中缺少哪些文件。

我尝试读取SAS txt文件,该文件充满空白,并能够通过以下方式删除并获取内容:

d <- read.delim("testSAS.txt", sep = ":", strip.white = TRUE, skip = 2, header = FALSE)

其结果是:

                               V1             V2
1               1,2,3,201,202,203      Screening
2    101,102,301,302,404,405,1001  Cycle 1 Day 1
3                            1002  Cycle 1 Day 2
4                            1003  Cycle 1 Day 3
5 103,104,303,304,407,408,409,410  Cycle 1 Day 8
6         105,106,305,306,412,413 Cycle 1 Day 15

现在,我想分隔V1值,以使每个V1值都附加一个具有相同值的新行,如下所示:

1   Screening
2   Screening
3   Screening
201 Screening
202 Screening
203 Screening

我已使用以下代码使它更具延展性,但似乎返回了变形的列表:

df<- data.frame(matrix(unlist(d), nrow = 61, byrow = T),stringsAsFactors = FALSE)

现在想将其与Excel文件进​​行比较,以便最终生成一个txt或xlsx,说明哪些V1值不存在。

是否有比处理SAS txt文件更快的方法?我应该如何进行呢?从excel到txt更快,反之亦然?

欢迎任何建议!

1 个答案:

答案 0 :(得分:0)

如果您的文件格式为.sas7bdat,则使用“ haven”包读取这样的sas文件。要读取xlsx文件,可以使用openxlsx文件,该文件不会具有任何Java依赖项,因此应该可以正常工作。参见下面的示例操作方法:

install.packages("haven")
library(haven)
sasfile <- haven::read_sas("path/to/sas/file.sas7bdat")

install.packages("openxlsx")
library(openxlsx)
xlsxfile <- openxlsx::read.xlsx(xlsxFile = "path/to/xlsx/file.xlsx")

编辑原始答案,现在我了解到您想融合它。

为了以您想要的方式融合您的数据,我会做类似的事情

install.packages("stringr")
install.packages("plyr")
library(stringr)
library(plyr)
new_df <-plyr::ddply(df, .(V2),function(x) data.frame(V1=unlist(stringr::str_split(df$V1, pattern = ","))))

要根据需要重新排列列,您可以

new_df <- new_df[,c("V1","V2")]

然后使用自定义构建的“ dataCompareR”来比较R中的2个数据集。(该软件包实际上是为了复制sas proc比较过程而构建的,因此您可以使用不同的参数来查看要获取的内容)

install.packages("dataCompareR")
dataCompareR::rCompare(dfA = sasfile,dfB = xlsxfile)

注意:我没有测试代码,因此请在注释中告知我是否可行。