R-환경설정 및 기본

11 minute read

R

R 이란 통계 계산과 그래픽을 위해 특화된 프로그래밍 언어이자 소프트웨어 환경이다. 패키지 개발이 용이하여 원하는 패키지를 가져다가 활용하는 것이 쉬워 널리 사용된다.

장점

  1. 다양한 통계 기법과 수치 해석 기법을 지원한다.
  2. R은 사용자가 제작한 패키지를 추가할 수 있다.
  3. 행렬 계산이 가능하다.
  4. 오픈소스 패키지의 집합 이기 때문에 필요한 부분을 가져다가 사용하면 된다.

R과 R Studio 설치는 아래 링크을 참조하였습니다.
참조: 백곰 블로그

통계에서 측정수준에 따른 변수

측정수준: 측정의 수준은 측정 대상의 속성을 측정하는 방식을 말한다. 축정의 방식은 척도의 의미를 갖기 때문에 측정 척도라고 한다.


참조: 컴세상 만세 Cafe

R에서 제공하는 자료구조

  1. Vector: 1차원 배열 형태의 자료구조, 같은 자료형의 데이터를 정해진 갯수만큼 모아놓음
  2. Metircs: 2차원의 dataset, 동일한 데이터 타입을 가진다.
  3. Array: 어떠한 차원으로도 가능, 동일한 데이터 타입을 가진다.
  4. List: 서로다른 데이터를 기억할 수 있다.
  5. DataFrame: 데이터 베이스의 테이블 구조와 유사, 칼럼 단위로 type이 달라도 됨

R 실습용 Data

앞으로의 실습에서는 다양한 Type의 Data를 활용할 것 이다. 이를 위하여 미리 실습에 사용할 데이터를 다운받아 놓는 것을 추천한다.
실습용 Data 주소
Data의 원본은 pykwon 깃허브 에있습니다.

R 에서 Data Type 확인하기

자료형 의미 종류
Mode원시 자료형(S1)숫자형, 리스트, 함수 등
ClassR 객체지향 관점에서의 자료형거리, 시간의 한지점, 숫자 등
Type원시 자료형(R)-2147483648 ~ 2147483647


R 에서 시각화

데이터 시각화란 데이터를 그림이나 그래프를 통해 시각적으로 표현하는 모든 과정인다. 시각화는 단순히 예쁘게, 멋있게 만들어 주는 것 뿐만 아니라 데이터를 쉽게 이해할 수 있도록 도와준다.
R에서 특히 시각화를 사용할때 사용자 계정이 한글이면 오류가 난다. 아래의 링크를 참조하여 이러한 현상을 해결하였다.
참조: R Friend 블로그

R 에서 Data Type 확인하기

R에서는 Java에서 보지못한 특별한 값을 표현하는 방식이 있다.

  1. NA(Not Available, 결측값): Missing Value 혹은 데이터값이 존재하지 않는 경우
  2. NULL: 값이 없다는 의미이다.
    NA는 지정한 범위의 값이 아닐때, NULL은 값이 아예 존재하지 않을 경우!
  3. Inf(Infinite): 무한대를 의미
  4. NaN(Not a Number): 0/0처럼 수학적으로 정의가 되지 않는 것을 의미한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
#변수와 데이터 유형

# 변수: 참조형, 들어오는 값에 의해 타입을 결정한다.
# <-로서 값을 대입하게 된다.
va<-1
4->var2
# Java랑 다르게 변수명에 . 찍어서 표현 가능
var.first<-5
a<-5
b<-6
#R 에서도 Java랑 같이 4칙 연산 및 기본적인 연산 가능
c<-a+b
print(c)


#데이터유형 - 수치형
kbs<-9
object.size(kbs)
typeof(kbs)
typeof(5)
typeof(5.5)
is(kbs) #numeric:integer, double
mbc<-as.integer(kbs) # 형변환
is(mbc)
sbs<-5L #"L"을 붙이면 integer가 된다.
typeof(sbs)

#데이터유형 - 문자형
string<-"홍길동"
string<-'홍길동'
typeof(string)
is.character(string)

#데이터유형 - 논리형
b<-TRUE #logical형 타입
b<-T
is.logical(b)
typeof(b)

#데이터유형 - 복소수형
z<-5.3-3i
z
Re(z)
Im(z)
is.complex(z)

#특별한 형
#NA, NULL, NaN
aa<-NA #결측치: 값이 입력되지 않은 상태
aa
is.na(aa)
sum(2,3,na.rm = T) #연산되지 않는다.
aa<-NULL #그냥 값이 없는 상태
aa
sum(2,3,NULL) #자동으로 NULL을 제외하고 연산한다.
aa<-NaN
aa
sum(2,3,NaN)

typeof(NULL) #="NULL"
typeof(NA) #="logical"
typeof(NaN) #="double"
length(NULL) #=0
length(NA) #=1
length(NaN) #=1
Inf
0/0
Inf*0
Inf+Inf#=Inf
Inf/Inf#=NaN
Inf*Inf#=Inf
Inf-Inf#=NaN

#Factor(요인형)
kbs<-c("second","first","third","second") #문자열벡터, c:combination함수
kbs
is.factor(kbs)
is.character(kbs)
mbc<-as.factor(kbs)
mbc
is.factor(mbc)
levels(mbc)#문자열의 순위 출력
summary(mbc)#빈도수 출력
plot(mbc)#빈도수를 그래프로 출력

mbc2<-factor(mbc,levels=c("third","second","first"),ordered = TRUE)
mbc2
plot(mbc2)
plot(mbc)

names<-c("공길동","홍길동","사임당")
gender<-c("2","2","1")
(names<-c(names,"손오공"))#print(...)와 같은 기능
print(gender<-c(gender,"남자"))
names
gender
str(names)#R은 index가 1부터 출발
str(gender)
gender[5]<-"여자"
gender
f.gender<-factor(gender)
f.gender
str(f.gender)
levels(f.gender)

ans<-c(2,2,3,2,3,4,4,4,3,4)
ans
f.ans<-factor(ans)
f.ans
str(f.ans)
f.ans<-factor(ans,levels=c(1,2,3,4,5))
f.ans
str(f.ans)
f.ans<-factor(ans,levels=c(1,2,3,4,5),ordered=TRUE)
f.ans
str(f.ans)
f.ans<-factor(ans,levels=c(1,2,3,4,5),ordered=TRUE,
              labels=c("매우불만","불만","보통","만족","매우만족"))
f.ans
str(f.ans)

names<-c("고길동","심길동","사임당")
gender<-c("2","2","1")
df<-data.frame(name=names,gender=gender)
df
str(df)
df2<-data.frame(name=names,gender=gender)
df2
str(df2)

#함수
f<-function(){
  return('good')
}
f()

#Type, Class, Mode 확인
a<-1
a
print('a')
print('a','b')
cat('a','','b') #복수개를 출력할때
cat('c')
x<-TRUE; cat(mode(x),class(x),typeof(x)) #logical logical logical
x<-3L; cat(mode(x),class(x),typeof(x)) #numeric integer integer
x<-3.14; cat(mode(x),class(x),typeof(x)) #numeric numeric double
x<-"kor"; cat(mode(x),class(x),typeof(x)) #character character character
x<-f; cat(mode(x),class(x),typeof(x)) #function function closure

kbs<-c("two","one","two")
kbs
mbc<-as.factor(kbs)
mbc
mbc2<-as.factor(kbs,levels=c("two","one"),ordered=T)
mbc2
cat(kbs,'',mode(kbs),'',class(kbs))
cat(mbc,'',mode(mbc),'',class(mbc))
cat(mbc2,'',mode(mbc2),'',class(mbc2))
strOptions(kbs)


# 변수확인 및 삭제
ls()
ls.str()
rm(a) #변수'a' 삭제
a
ls()
rm(list=ls()) #모든변수 삭제 : 변수는 삭제되었으나 메모리는 아직 확보중.
gc() #가비지컬렉터 호출=메모리 해제.

# package: data+function+logic, R 함수들을 담아둠.
available.packages()
dim(available.packages())
sessionInfo()

installed.packages() #설치된 패키지 확인
install.packages('plyr') #'pltr' 설치 
length(installed.packages())

require(plyr)
library(plyr)
search()
ls('package:plyr')
lsf.str('package:plyr')
data(package='plyr')
remove.packages("plyr")

# 기본 dataset
data()
Nile
head(Nile)
tail(Nile)
tail(Nile,10)
hist(Nile)
hist(Nile,freq=F)
lines(density(Nile))

#여러가지함수
?hist
help("hist") #히스토그램에 대한 도움말
args(max)

example("seq")
example("mean")
mean(10:20,trim = 0.10)

getwd() #경로확인
#setwd("c:/work/...") #경로변경
read
data<-read.csv("C:/git/R/Data/test.csv",header = F)
data<-read.csv("C:/git/R/Data/test.csv",header = T)
data
args(read.csv)
head(data)


#object type
#vector:1차원배열 - 가장 작은 data type. 참고: scala X
year<-2019
is(year)
is.vector(year)
name<-"tom"
is.vector(name)

base::seq(1,5) #1 2 3 4 5
seq(1,10,2) #1 3 5 7 9
seq(1,10,length.out = 4) #1  4  7 10
seq(1,10,length.out = 3) #1.0  5.5 10.0

rep(1:3,3) #1 2 3 1 2 3 1 2 3
rep(1:3, each=3) #1 1 1 2 2 2 3 3 3

vec<-c(10,20,30,-40,-20) #10  20  30 -40 -20
is.vector(vec)
c(1:20) #1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
x<-c(1,3,5) #1 3 5
y<-c(1:3,1:3) #1 2 3 1 2 3
x;y
c(33,-5,20:23,12,-2:3) #33 -5 20 21 22 23 12 -2 -1  0  1  2  3
c("홍길동","고길동")
c(TRUE,T,FALSE,T) #TRUE  TRUE FALSE  TRUE

#배열에 담으면 우선순위의 타입을 나머지들이 따라간다.
c(2L,3.5,T,F) #2.0 3.5 1.0(TRUE) 0.0(FALSE)
c(2L,3.5,T,F,"5") #"2"     "3.5"   "TRUE"  "FALSE" "5"

age<-c(10,20,30)
age
names(age)<-c("조조","관우","장비") # age라는 밸류에 이름(like a key)을 붙여준다.
#조조 관우 장비 
# 10   20   30 
age
age[1]
age[0]
age[5]
age["관우"]
age<-c(age,40) #벡터값 추가
age
age[10]<-50 #10째값이 추가됨으로서 5~9번째 값도 NA로 강제적으로 추가된다.
age
# 결과
# 조조 관우 장비                                    
# 10   20   30   40   NA   NA   NA   NA   NA   50 
age2<-append(age,60,after = 6)
age2
age[1]<-NA #개별값에는 NA를 줄 수 있다.
age
age<-NULL #NULL은 개별값에는 줄 수 없고 배열 전체에 줄 수 있다. 
# -> 인스턴스의 참조관계가 끊어진다.
age



#슬라이싱
v1<-c(13,-5,20:23,12,-2:3)
v1
v1[1]
v1[1:3] #13 -5 20
v1[c(1,3,4)] #13 20 21
v1[c(1,3,4:7)] #13 20 21 22 23 12
v1[-1] #-5 20 21 22 23 12 -2 -1  0  1  2  3
v1[-c(1,3,4)] #-5 22 23 12 -2 -1  0  1  2  3

v1[2:5] #-5 20 21 22
v1[2:(length(v1)-5)] #-5 20 21 22 23 12 -2

a<-1:10
b<-rep(c(T,F),5)
b #TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE
a[b] #1 3 5 7 9
a[!b] #2  4  6  8 10

b2<-rep(c(F,F,F,F,T),2)
b2 #FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE
a[b2] #5 10

a<-1:30
a # 1~30 출력
b<-a%%3
b
a[b==0] #3  6  9 12 15 18 21 24 27 30

a<-c("a","b","c")
length(a)
NROW(x) #3. vector,matrix 0
nrow(x) #NULL. matrix 0
a[1]
'b' %in% a #TRUE
'k' %in% a #FALSE

a<-1:5
a+5
a-1
a^2 #거듭제곱: 1  4  9 16 25
sqrt(a) #제곱근: 1.000000 1.414214 1.732051 2.000000 2.236068

a<-1:3
b<-4:6
a;b
a+b
a-b
a*b
a/b
a[4]<-2
a
b
b[4]<-2
union(a,b) #1 2 3 4 5 6 : 합집합-중복비허용
c(a,b) #1 2 3 2 4 5 6 2 : 합집합-중복허용
setdiff(a,b) # 1 3 : 차집합
intersect(a,b) #2 : 교집합
c(1,2,3)==c(1,2,10) #TRUE  TRUE FALSE

#matrix: 2차원배열

a<-1:8
dim(a)
dim(a)<-c(2,4)
a
class(a)
mode(a)

m<-matrix(1:5) #matrix-열부터 채운다.
m
m<-matrix(c(1:9),nrow=3)
m
m<-matrix(c(1:9),nrow=3,byrow=TRUE) #byrow=TRUE:행부터 채우기
m
m2<-matrix(1:10,2)
m2
dim(m2) #matrix의 차원을 표현
m3<-matrix(1:12,2)
m3
m3<-matrix(1:10,3)
m3
m3[1,] #1행만 출력
m3[,3] #3열만 출력력
m3[2,3]
m3[1,c(2:4)] #1행 2~4열
m3[1:2,2:4]
m3[,-1] # 1열 제외
m3[-1,-1] # 1행과 1열 제외
m3

#matrix에도 이름을 줄 수 있다.
matrix(1:9,nrow=3,dimnames = list(c("r1","r2","r3"),c("c1","c2","c3")))
a<-matrix(c(1:9),nrow=3)
a
rownames(a)<-c("r1","r2","r3")
colnames(a)<-c("c1","c2","c3")
a
length(a) #9
nrow(a) #3
ncol(a) #3
dim(a) # 3 3 - 3by3이라는 의미

#matrix연산 - 일반적인 가감승제는 문제가 전혀없다.
a<-matrix(c(1,2,3,4),2,2)
a
b<-matrix(5:8,2,2)
b
a+b
a-b
a*b
a/b

a%*%b
#결과  [,1] [,2]
#[1,]   23   31
#[2,]   34   46

a
diag(a)
diag(2)
a
#      [,1] [,2]
#[1,]    1    3
#[2,]    2    4
t(a) #전치
#      [,1] [,2]
#[1,]    1    2
#[2,]    3    4
solve(a) #a의 역행렬
solve(solve(a)) #역행렬의 역행렬 - a
solve(a)%*%a #a역행렬%*%a=단위행렬

x1<-c(5,40,50,52)
x2<-c(30,5,6:8) 
x1;x2
mr<-rbind(x1,x2) #두 배열을 행렬로 bind
mr
cr<-cbind(x1,x2) #두 배열을 행과열이 바뀐 행렬로 bind
cr

# 함수를 실행하는 함수
# base::apply(변수,행/열,함수) - lapply(),tapply(),sapply()
x<-matrix(c(1:9),nrow=3,ncol=3)
x
apply(x,1,max) #행단위 max
apply(x,1,min) #행단위 min
apply(x,2,max) #열단위 max
apply(x,2,min) #열단위 min
apply(x,2,mean) #열단위 mean

myfunc<-function(x){
  x+c(5,10,15)
}
res<-apply(x, 1, myfunc)
res

a<-apply(x, 2, mean)
class(a)
b<-lapply(x, mean)
class(b)
c<-sapply(x, mean)
class(c)


# Array: 다차원배열
d<-c(1:12)
class(d) #"integer"

arr1<-base::array(d)
arr1
class(arr1) #"array"

arr2<-array(c(1:12),dim=c(6,12))
arr2
dim(arr2)

arr3<-array(c(1:12),dim=c(3,2,2))
arr3
dim(arr3)

arr3[,,1]
arr3[,1,1]
arr3[1,1,1]
arr3[1,,1]

a1<-array(1:8,c(2,2,2))
a2<-array(8:1,c(2,2,2))
a1;a2

a1-a2
a1%*%a2
sum(a1*a2)

#List: 서로 다른 타입의 자료 기억. (키,값)형태의 자료를 담는 연관배열 (C언어의 구조체와 비슷)
li<-list("1","이순신",90,"2","홍길동신",80)
li
class(li) #"list"

unli<-unlist(li) #list를 풀 수 있다.
unli
class(unli) #"character"

num<-list(c(1:5),c(6:10),c("a","b","c"))
num
num[1] #1 2 3 4 5
class(num[1]) #"list"
num[[1]] #1 2 3 4 5
class(num[[1]]) #"integer"
num[[1]][2] #2

num2<-list(x=c(1:5),y=c(6:10))
num2
num2$x #1 2 3 4 5
num2$x[2] #2
plot(num2)

member<-list(name="hong",age=25)
member
member$age<-30
member$id<-"kor"
member$age<-NULL
member
length(member) #2

a<-list(c(1:5))
b<-list(6:10)
a;b
rel<-lapply(c(a,b),max)
rel
class(rel) #"list"

re2<-sapply(c(a,b),max)
re2
class(re2) #"integer"

a<-list()
tracemem(a) #"<00000254C1ECCC80>":메모리 추적
a;b<-c(1,2,3)
untracemem(a)
a
#DataFrame: 테이블구조. 열별로 자료형이 달라도 된다.

#1)vector로 data,frame 객체 생성
no<-c(1,2,3)
name<-c("hong","lee","kim")
pay<-c(200,250,300)
df<-data.frame(bunho=no,irum=name,imkum=pay)
df
#결과  bunho irum imkum
#1         1 hong   200
#2         2  lee   250
#3         3  kim   300
class(df) #"data.frame"
mode(df) #"list"
is(df) # "data.frame" "list" "oldClass" "vector"

df<-data.frame(irum=c("james","oscar","tom"),nai=c(27,25,33))
df<-data.frame(irum=c("james","oscar","tom"),nai=c(27,25,33)
               ,row.names=c("one","two","three"))
df
#결과   irum nai
#one   james  27
#two   oscar  25
#three   tom  33

nrow(df)
ncol(df)
str(df)
summary(df)
#irum        nai       
#james:1   Min.   :25.00  
#oscar:1   1st Qu.:26.00  
#tom  :1   Median :27.00  
#Mean   :28.33  
#3rd Qu.:30.00  
#Max.   :33.00 

tail(df,n=2)
#       irum nai
#two   oscar  25
#three   tom  33
names(df) #"irum" "nai" 

#2)matrix로 data.frame 객체생성
m<-matrix(c(1,"hong",250,2,"lee",300,3,"kim",350),3)
m
#     [,1]   [,2]  [,3] 
#[1,] "1"    "2"   "3"  
#[2,] "hong" "lee" "kim"
#[3,] "250"  "300" "350"
mdf<-data.frame(m)
mdf

m<-matrix(1:6,nrow=3)
mdf<-data.frame(m)
mdf
colnames(mdf)<-c("c1","c2")
mdf

#indexing
mdf$c1
mdf['c1']
mdf[1,2]
mdf[,2]

mdf[2:3,c(1,2)]
mdf[2:3,c('c1','c2')]

mdf[mdf$c1==2&mdf$c2==5,]
subset(mdf,c1==2&c2==5)

mdf[mdf$c1==2,c(1,2)]
subset(mdf,c1==2,select=c(1,2))

mdf$c2<-ifelse(mdf$c2==4,NA,mdf$c2)
mdf
summary(mdf)
mean(mdf$c1)
mean(mdf$c2)
mean(mdf$c2,na.rm = T)

#행/열 추가,삭제
mdfr<-rbind(mdf,c(10,11))
mdfr
mdfc<-cbind(mdf,c3=c("A","B","C"),c4=c("A1","B1","C1"))
mdfc

mdfc[,"c1"]<-NULL
mdfc

mdfr<-mdfr[-1,]
mdfr

txtdf<-read.table('testdata/emp.txt',header = T) #제목으로서 사용한다.
txtdf

df<-data.frame(eng=c(90,80,70),mat=c(50,60,70),class=c(1,2,3))
df
save(df,file='output/df_1.rda')
rm(df)
df
load('output/df_1.rda')
df

#apply()
data("iris",package="datasets")
hard(iris)
dim(iris)
apply(iris[1:4],1,mean)
apply(iris[1:4],2,mean)
lapply(iris[1:4],mean)
sapply(iris[1:4],mean)
sapply(iris,class)

tapply(1:10,rep(1,10),sum)
tapply(1:10,1:10%%2==1,sum)
tapply(iris$Petal.Length,iris$Species,mean)

ages<-c(25,26,27,28,30)
party<-c('서울','경기','서울','경기','기타')
tapply(ages,party,mean)

#계절별 성별, 판매자료 처리
m<-matrix(1:8,ncol=2, dimnames=list(c("spring","summer","fall","winter")
                                    ,c("male","female")))
m

#반기별 성별 셀자료의 합
tapply(m,list(c(1,1,2,2,1,1,2,2),c(1,1,1,1,2,2,2,2)),sum)

#data.table type : data.frame 개선된 패키지
install.packages("data.table")
library(data.table)
idata<-as.data.table(iris)
head(idata,3)
class(idata) #"data.table" "data.frame"
mean(idata$Sepal.Length)
str(idata)

#merge
height=data.frame(id=c(1,2,2),h=c(180,175,178))
weight=data.frame(id=c(1,2),w=c(80,75))
height;weight

merge(height,weight)
merge(height,weight,by.x="id",by.y="id")
merge(height,weight,all=TRUE)

#그룹연산
df<-data.frame(k1=c('a','a','b','b','a'),
               k2=c('one','two','one','two','one'),
               data1=rnorm(5),
               data2=rnorm(5))
df
#  k1  k2      data1       data2
#1  a one  0.1216698 -1.28263917
#2  a two -0.2048755  1.18558207
#3  b one  0.2783191  0.62038479
#4  b two  1.4902172 -0.40826891
#5  a one  1.0970141  0.03022722

installed.packages("dplyr")
library(dplyr)

summarise(group_by(df,k1),평균=mean(data1))
summarise(group_by(df,k1,k2),평균=mean(data1))


참조: 원본코드
코드에 문제가 있거나 궁금한 점이 있으면 wjddyd66@naver.com으로 Mail을 남겨주세요.

Categories:

Updated:

Leave a comment