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更快,反之亦然?
欢迎任何建议!
答案 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)
注意:我没有测试代码,因此请在注释中告知我是否可行。