R的数据输入

Posted zm-pop-pk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R的数据输入相关的知识,希望对你有一定的参考价值。

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行完全相同,这里的行数是指排完序后的。任务完成。

以上是关于R的数据输入的主要内容,如果未能解决你的问题,请参考以下文章

r R有用的代码片段

需要对特定 R 代码片段的解释

有人可以解释以下 R 代码片段吗? [关闭]

如何将 r ggplot 图存储为 html 代码片段

sql [SQL查询片段]用于在命令行或通过R和其他工具使用SQL的快速代码段#tags:sql,R,text processing,命令li

关于代码片段的时间复杂度