1.使用键盘输入
edit()函数会调用一个允许手动输入的文本编辑器。
1 > mydata<-data.frame(age=numeric(0),gender=character(0),weight=numeric(0)) 2 > mydata<-edit(mydata)
2.导入.csv文件
2.1 read.table()
2.2 read.csv()
示例:找到表格中完全相同的行。
(1)由于含有完全相同的行的数据无法导入到R,所以现在原表格加入一列作为第一列,一来使不存在完全一致的两行,二来区分不同的行。在Excel中将表格以第2列排序,这样只要每行与它的下一行比较就行。将表格另存为.csv文件。
(2)读取表格,赋值给变量a,a的模式为数据框。在读取表格时,里面的中文全部变成符号,解决办法为:将.csv文件用记事本打开,另存为,更改编码方式为UTF-8。检查读取是否准确:看行数、列数、行名、列名。发现行数、行名正确,而"住院总费用.西药费.抗菌药物费用"读成了同一列,这一问题有待解决。
1 > a<-read.csv('C:\\新建 Microsoft Excel 工作表.csv',encoding='UTF-8',header=T) 2 3 > str(a) 4 'data.frame': 23 obs. of 13 variables: 5 $ 编号 : int 175014 289140 311838 319812 362385 362426 363145 363649 363935 364505 ... 6 $ 病案号码 : Factor w/ 15 levels "超声内镜引导下细针穿刺活检术,男,50",..: 6 9 4 8 11 13 13 13 7 2 ... 7 $ 手术名称 : Factor w/ 17 levels "53","58","60",..: 2 17 11 5 7 14 16 10 11 8 ... 8 $ 性别 : Factor w/ 11 levels "","60","61","62",..: 1 3 10 1 11 5 2 6 8 11 ... 9 $ 年龄 : Factor w/ 9 levels "","2019/5/13 0:00",..: 5 9 1 2 8 1 1 1 1 7 ... 10 $ 体重 : Factor w/ 13 levels "2019/5/10","2019/5/13",..: 6 2 5 9 4 11 5 13 10 1 ... 11 $ 过敏 : Factor w/ 15 levels "2019/4/26","2019/4/28",..: 9 10 4 7 14 2 12 11 1 15 ... 12 $ 手术日期 : Factor w/ 18 levels "13307.91","2019/5/10",..: 10 12 7 13 9 2 6 3 4 1 ... 13 $ 入院日期 : Factor w/ 19 levels "12461.06","19653.31",..: 12 14 9 15 7 17 17 18 10 3 ... 14 $ 出院日期 : Factor w/ 20 levels "111372.39","1554.99",..: 13 17 19 6 15 5 4 8 1 18 ... 15 $ 主要诊断 : num 144 2283 71320 6683 NA ... 16 $ 出院科室 : num 0 315 1447 642 NA ... 17 $ 住院总费用.西药费.抗菌药物费用: num NA NA 0 NA NA NA NA NA NA NA ... 18 19 > nrow(a) 20 [1] 23 21 > rownames(a) 22 [1] "6" "13" "4" "16" "18" "9" "12" "15" "23" "2" "22" "8" "20" "10" "19" "11" "21" "1" "7" "17" "5" "14" "3" 23 > ncol(a) 24 [1] 13 25 > colnames(a) 26 [1] "编号" "病案号码" "手术名称" 27 [4] "性别" "年龄" "体重" 28 [7] "过敏" "手术日期" "入院日期" 29 [10] "出院日期" "主要诊断" "出院科室" 30 [13] "住院总费用.西药费.抗菌药物费用"
(3)去掉第1列,寻找完全一致的行,行名存放在n这个变量中,查看结果。
1 > a<-a[,-1] 2 3 > n<-NULL 4 5 > for (i in 1:(nrow(a)-1)){ 6 + if (a[i,]==a[i+1,]) 7 + n<-c(n,i) 8 + } 9 There were 22 warnings (use warnings() to see them) 10 11 > n 12 [1] 6 7 10 14 21
(4)发现根本不对,经过分析,第6行代码是对每列分别判断,只要有一个为True,就认为是相同行,这显然是不对的,因此修改执行条件。
1 > #以第1行和第2行数据为例 2 > a[1,]==a[2,] 3 病案号码 手术名称 性别 年龄 体重 过敏 手术日期 入院日期 出院日期 主要诊断 出院科室 住院总费用.西药费.抗菌药物费用 4 6 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE 5 > all(a[1,]==a[2,]) 6 [1] FALSE 7 8 > #再次运行 9 > a<-read.csv('C:\\新建 Microsoft Excel 工作表.csv',encoding='UTF-8',header=T) 10 > a<-a[,-1] 11 > n<-NULL 12 > for (i in 1:(nrow(a)-1)){ 13 + if (all(a[i,]==a[i+1,])) 14 + n<-c(n,i) 15 + } 16 Error in if (all(a[i, ] == a[i + 1, ])) n <- c(n, i) : 17 missing value where TRUE/FALSE needed 18 > n 19 NULL
(5)依然不成功。根据第16、17行的报错,是缺少用于判断是否执行的True或False的值。经过分析,是因为数据中存在缺失值,all()函数会把含有NA的逻辑变量认为是NA,因此无法判断。解决办法:将所有NA值替换为0。
1 > #用0替换NA 2 > a[is.na(a)]<-0 3 4 > #再次运行 5 > n<-NULL 6 > for (i in 1:(nrow(a)-1)){ 7 + if (all(a[i,]==a[i+1,])) 8 + n<-c(n,i) 9 + } 10 11 输出结果 12 > n 13 [1] 10 14 21
结果为10、14、21,查看原表格,发现果然是第10、14、21行与第11、15、22行完全相同,这里的行数是指排完序后的。任务完成。