Bevezetés az R-be 2.0 - Feladatgyűjtemény

Adattáblák összekapcsolása

1. feladat. Adattáblák összekapcsolása.
Az elemzések során a vizsgálati személyek szocio-demográfia adatait (nem, életkor, iskolai végzettség stb.) és a vizsgálat során keletkező adatait (pl. reakcióidő) gyakran külön tároljuk. Az elemzés egy adott fázisában szükség lehet a két adattábla egyesítésére. (Ez a művelet az adatbázis-kezelés összekapcsolás vagy join művelete.) Végezzük el a feladatot!

Olvassuk be a szocio-demográfiai adatokat

d.szemelyek <- read.table("http://users.atw.hu/rdata/merge_szemelyek.txt", 
                          sep="\t", header=T, dec=".", quote="", comment.char="")
d.szemelyek # 5 személy
  SUBJECT NEME ELETKOR
1      KS    f      12
2      TR    f      11
3      SE    f      12
4      AK    n      11
5      TF    n      11

Olvassuk be a vizsgálat során keletkező adatokat (személyenként 10 reakcióidő adat)

d.vizsgalat <- read.table("http://users.atw.hu/rdata/merge_vizsgalat.txt", 
                          sep="\t", header=T, dec=".", quote="", comment.char="")
d.vizsgalat
   SUBJECT KERDES   RI
1       KS    k.1 1305
2       KS    k.2 1238
3       KS    k.3  627
4       KS    k.4  906
5       KS    k.5 1422
6       KS    k.6 1093
7       KS    k.7  545
8       KS    k.8  848
9       KS    k.9  572
10      KS   k.10  790
11      TR    k.1 1427
12      TR    k.2 1391
13      TR    k.3 1341
14      TR    k.4 1020
15      TR    k.5 1456
16      TR    k.6 1293
17      TR    k.7 1204
18      TR    k.8 1363
19      TR    k.9  644
20      TR   k.10 1155
21      SE    k.1 1218
22      SE    k.2  910
23      SE    k.3 1265
24      SE    k.4  538
25      SE    k.5 1405
26      SE    k.6  790
27      SE    k.7  682
28      SE    k.8  999
29      SE    k.9 1078
30      SE   k.10  926
31      AK    k.1  544
32      AK    k.2  524
33      AK    k.3  913
34      AK    k.4 1218
35      AK    k.5 1445
36      AK    k.6  583
37      AK    k.7  771
38      AK    k.8  923
39      AK    k.9  787
40      AK   k.10 1254
41      TF    k.1  600
42      TF    k.2  867
43      TF    k.3  906
44      TF    k.4  916
45      TF    k.5  740
46      TF    k.6 1478
47      TF    k.7  766
48      TF    k.8  535
49      TF    k.9 1161
50      TF   k.10 1472

Egyszerű összekapcsolás

A merge() függvény segítségével a beolvasott adatainkat egyetlen adattáblában tárolhatjuk el. A paraméterben felsoroljuk a két összekapcsolandó adattábla nevét (x=, y=), majd a közös oszlop nevét (by=) adjuk meg. Az összekapcsolás során egy sorba kerülnek az azonos SUBJECT oszlopbeli értékkel rendelkező adatmezők a két adattáblából. Az új adattábla oszlopai a két kiinduló adattáblából tevődnek össze, a kapcsoló oszlop egyszer fog megjelenni.

merge(x=d.szemelyek, y=d.vizsgalat, by="SUBJECT")
   SUBJECT NEME ELETKOR KERDES   RI
1       AK    n      11    k.1  544
2       AK    n      11    k.2  524
3       AK    n      11    k.3  913
4       AK    n      11    k.4 1218
5       AK    n      11    k.5 1445
6       AK    n      11    k.6  583
7       AK    n      11    k.7  771
8       AK    n      11    k.8  923
9       AK    n      11    k.9  787
10      AK    n      11   k.10 1254
11      KS    f      12    k.1 1305
12      KS    f      12    k.2 1238
13      KS    f      12    k.3  627
14      KS    f      12    k.4  906
15      KS    f      12    k.5 1422
16      KS    f      12    k.6 1093
17      KS    f      12    k.7  545
18      KS    f      12    k.8  848
19      KS    f      12    k.9  572
20      KS    f      12   k.10  790
21      SE    f      12    k.1 1218
22      SE    f      12    k.2  910
23      SE    f      12    k.3 1265
24      SE    f      12    k.4  538
25      SE    f      12    k.5 1405
26      SE    f      12    k.6  790
27      SE    f      12    k.7  682
28      SE    f      12    k.8  999
29      SE    f      12    k.9 1078
30      SE    f      12   k.10  926
31      TF    n      11    k.1  600
32      TF    n      11    k.2  867
33      TF    n      11    k.3  906
34      TF    n      11    k.4  916
35      TF    n      11    k.5  740
36      TF    n      11    k.6 1478
37      TF    n      11    k.7  766
38      TF    n      11    k.8  535
39      TF    n      11    k.9 1161
40      TF    n      11   k.10 1472
41      TR    f      11    k.1 1427
42      TR    f      11    k.2 1391
43      TR    f      11    k.3 1341
44      TR    f      11    k.4 1020
45      TR    f      11    k.5 1456
46      TR    f      11    k.6 1293
47      TR    f      11    k.7 1204
48      TR    f      11    k.8 1363
49      TR    f      11    k.9  644
50      TR    f      11   k.10 1155

Több személy

Tegyük fel, hogy még egy személyről van demográfiai adatunk, de ő még nem végezte a kísérletet. Ekkor az összekapcsolásnál figyelnünk kell. Először hozzunk létre egy új adattáblát a d.szemelyek alapján, amely egy új személy adatait is tartalmazza:

d.szemelyek.2 <- rbind(d.szemelyek, data.frame(SUBJECT="ZsV", NEME="f", ELETKOR=13))
d.szemelyek.2
  SUBJECT NEME ELETKOR
1      KS    f      12
2      TR    f      11
3      SE    f      12
4      AK    n      11
5      TF    n      11
6     ZsV    f      13

Az egyszerű összekapcsolás most nem megfelelő, hiszen ZsV-t kihagyja az outputból:

merge(d.szemelyek.2, d.vizsgalat, by="SUBJECT")
   SUBJECT NEME ELETKOR KERDES   RI
1       AK    n      11    k.1  544
2       AK    n      11    k.2  524
3       AK    n      11    k.3  913
4       AK    n      11    k.4 1218
5       AK    n      11    k.5 1445
6       AK    n      11    k.6  583
7       AK    n      11    k.7  771
8       AK    n      11    k.8  923
9       AK    n      11    k.9  787
10      AK    n      11   k.10 1254
11      KS    f      12    k.1 1305
12      KS    f      12    k.2 1238
13      KS    f      12    k.3  627
14      KS    f      12    k.4  906
15      KS    f      12    k.5 1422
16      KS    f      12    k.6 1093
17      KS    f      12    k.7  545
18      KS    f      12    k.8  848
19      KS    f      12    k.9  572
20      KS    f      12   k.10  790
21      SE    f      12    k.1 1218
22      SE    f      12    k.2  910
23      SE    f      12    k.3 1265
24      SE    f      12    k.4  538
25      SE    f      12    k.5 1405
26      SE    f      12    k.6  790
27      SE    f      12    k.7  682
28      SE    f      12    k.8  999
29      SE    f      12    k.9 1078
30      SE    f      12   k.10  926
31      TF    n      11    k.1  600
32      TF    n      11    k.2  867
33      TF    n      11    k.3  906
34      TF    n      11    k.4  916
35      TF    n      11    k.5  740
36      TF    n      11    k.6 1478
37      TF    n      11    k.7  766
38      TF    n      11    k.8  535
39      TF    n      11    k.9 1161
40      TF    n      11   k.10 1472
41      TR    f      11    k.1 1427
42      TR    f      11    k.2 1391
43      TR    f      11    k.3 1341
44      TR    f      11    k.4 1020
45      TR    f      11    k.5 1456
46      TR    f      11    k.6 1293
47      TR    f      11    k.7 1204
48      TR    f      11    k.8 1363
49      TR    f      11    k.9  644
50      TR    f      11   k.10 1155

A megfelelő összekacsoláshoz használjuk az all.x=T argumentumot, amely biztosítja, hogy a első (x=) paraméterben szereplő d.szemelyek.2 adattáblából minden sor megjelenjen az outputban.

merge(d.szemelyek.2, d.vizsgalat, by="SUBJECT", all.x=T)
   SUBJECT NEME ELETKOR KERDES   RI
1       AK    n      11    k.1  544
2       AK    n      11    k.2  524
3       AK    n      11    k.3  913
4       AK    n      11    k.4 1218
5       AK    n      11    k.5 1445
6       AK    n      11    k.6  583
7       AK    n      11    k.7  771
8       AK    n      11    k.8  923
9       AK    n      11    k.9  787
10      AK    n      11   k.10 1254
11      KS    f      12    k.1 1305
12      KS    f      12    k.2 1238
13      KS    f      12    k.3  627
14      KS    f      12    k.4  906
15      KS    f      12    k.5 1422
16      KS    f      12    k.6 1093
17      KS    f      12    k.7  545
18      KS    f      12    k.8  848
19      KS    f      12    k.9  572
20      KS    f      12   k.10  790
21      SE    f      12    k.1 1218
22      SE    f      12    k.2  910
23      SE    f      12    k.3 1265
24      SE    f      12    k.4  538
25      SE    f      12    k.5 1405
26      SE    f      12    k.6  790
27      SE    f      12    k.7  682
28      SE    f      12    k.8  999
29      SE    f      12    k.9 1078
30      SE    f      12   k.10  926
31      TF    n      11    k.1  600
32      TF    n      11    k.2  867
33      TF    n      11    k.3  906
34      TF    n      11    k.4  916
35      TF    n      11    k.5  740
36      TF    n      11    k.6 1478
37      TF    n      11    k.7  766
38      TF    n      11    k.8  535
39      TF    n      11    k.9 1161
40      TF    n      11   k.10 1472
41      TR    f      11    k.1 1427
42      TR    f      11    k.2 1391
43      TR    f      11    k.3 1341
44      TR    f      11    k.4 1020
45      TR    f      11    k.5 1456
46      TR    f      11    k.6 1293
47      TR    f      11    k.7 1204
48      TR    f      11    k.8 1363
49      TR    f      11    k.9  644
50      TR    f      11   k.10 1155
51     ZsV    f      13   <NA>   NA

Több vizsgálati adat

Amennyiben olyan személyről is van vizsgálati adatunk, akinek a demográfiai adatait még nem rögzítettük, akkor a fenti esethez hasonló módosítást kell végrehajtani az argumentumban.

VE vizsgálati adatainak hozzáadása:
adatok.VE <- data.frame(SUBJECT=rep("VE",10), 
                        KERDES=paste(sep=".","k",1:10), 
                        RI=c(657, 1203, 785, 914, 1327, 799, 1129, 1411, 891, 582 ))
d.vizsgalat.2 <- rbind(d.vizsgalat, adatok.VE)
d.vizsgalat.2
   SUBJECT KERDES   RI
1       KS    k.1 1305
2       KS    k.2 1238
3       KS    k.3  627
4       KS    k.4  906
5       KS    k.5 1422
6       KS    k.6 1093
7       KS    k.7  545
8       KS    k.8  848
9       KS    k.9  572
10      KS   k.10  790
11      TR    k.1 1427
12      TR    k.2 1391
13      TR    k.3 1341
14      TR    k.4 1020
15      TR    k.5 1456
16      TR    k.6 1293
17      TR    k.7 1204
18      TR    k.8 1363
19      TR    k.9  644
20      TR   k.10 1155
21      SE    k.1 1218
22      SE    k.2  910
23      SE    k.3 1265
24      SE    k.4  538
25      SE    k.5 1405
26      SE    k.6  790
27      SE    k.7  682
28      SE    k.8  999
29      SE    k.9 1078
30      SE   k.10  926
31      AK    k.1  544
32      AK    k.2  524
33      AK    k.3  913
34      AK    k.4 1218
35      AK    k.5 1445
36      AK    k.6  583
37      AK    k.7  771
38      AK    k.8  923
39      AK    k.9  787
40      AK   k.10 1254
41      TF    k.1  600
42      TF    k.2  867
43      TF    k.3  906
44      TF    k.4  916
45      TF    k.5  740
46      TF    k.6 1478
47      TF    k.7  766
48      TF    k.8  535
49      TF    k.9 1161
50      TF   k.10 1472
51      VE    k.1  657
52      VE    k.2 1203
53      VE    k.3  785
54      VE    k.4  914
55      VE    k.5 1327
56      VE    k.6  799
57      VE    k.7 1129
58      VE    k.8 1411
59      VE    k.9  891
60      VE   k.10  582

A helyes összekapcsolás az all.y=T használatával:

merge(d.szemelyek, d.vizsgalat.2, by="SUBJECT", all.y=T)
   SUBJECT NEME ELETKOR KERDES   RI
1       AK    n      11    k.6  583
2       AK    n      11    k.7  771
3       AK    n      11    k.5 1445
4       AK    n      11    k.1  544
5       AK    n      11    k.2  524
6       AK    n      11    k.3  913
7       AK    n      11    k.4 1218
8       AK    n      11    k.9  787
9       AK    n      11   k.10 1254
10      AK    n      11    k.8  923
11      KS    f      12   k.10  790
12      KS    f      12    k.2 1238
13      KS    f      12    k.9  572
14      KS    f      12    k.1 1305
15      KS    f      12    k.6 1093
16      KS    f      12    k.3  627
17      KS    f      12    k.4  906
18      KS    f      12    k.5 1422
19      KS    f      12    k.7  545
20      KS    f      12    k.8  848
21      SE    f      12    k.2  910
22      SE    f      12    k.3 1265
23      SE    f      12    k.4  538
24      SE    f      12    k.1 1218
25      SE    f      12    k.6  790
26      SE    f      12    k.7  682
27      SE    f      12    k.8  999
28      SE    f      12    k.5 1405
29      SE    f      12   k.10  926
30      SE    f      12    k.9 1078
31      TF    n      11   k.10 1472
32      TF    n      11    k.8  535
33      TF    n      11    k.9 1161
34      TF    n      11    k.1  600
35      TF    n      11    k.2  867
36      TF    n      11    k.3  906
37      TF    n      11    k.4  916
38      TF    n      11    k.5  740
39      TF    n      11    k.6 1478
40      TF    n      11    k.7  766
41      TR    f      11    k.1 1427
42      TR    f      11    k.3 1341
43      TR    f      11    k.4 1020
44      TR    f      11    k.5 1456
45      TR    f      11    k.2 1391
46      TR    f      11    k.7 1204
47      TR    f      11    k.8 1363
48      TR    f      11    k.9  644
49      TR    f      11    k.6 1293
50      TR    f      11   k.10 1155
51      VE <NA>      NA    k.3  785
52      VE <NA>      NA    k.4  914
53      VE <NA>      NA    k.5 1327
54      VE <NA>      NA    k.6  799
55      VE <NA>      NA    k.7 1129
56      VE <NA>      NA    k.8 1411
57      VE <NA>      NA    k.9  891
58      VE <NA>      NA   k.10  582
59      VE <NA>      NA    k.2 1203
60      VE <NA>      NA    k.1  657