Hezka serie, diky.
Jen par doplneni:
Z datoveho ramce clovek snadno vybere jeden sloupec pomoci "$". To se hodi zejmena v typickem pouziti Rka k pocitani nejake statistiky. Cili napr.:
> languages <- data.frame(
+ id = c (1:9),
+ name = c("C", "Java", "Python", "C++", "C#", "Visual Basic", "JavaScript", "PHP", "R"),
+ usage = c(15.95, 13.48, 10.47, 7.11, 4.58, 4.12, 2.54, 2.49, 2.37),
+ change = c(0.74, -3.18, 0.59, 1.48, 1.18, 0.83, 0.41, 0.62, 1.33),
+ stringsAsFactors = FALSE
+ )
> mean(languages$usage)
[1] 7.012222
Souvisi to s tim, ze datovy ramec jako typ objektu vychazi z typu seznam.
Taky:
Pri vyberech je potreba davat pozor na to, ze R defaultne zahazuje "prebytecne dimenze" a pak meni typ. Pokud vybereme radek datoveho ramce, je vysledkem datovy ramec. Pokud ale vybereme sloupec, je pri vychozim nastaveni vysledkem vector (omlouvam se, nepamatuji si, jak to P. T. prelozil). Funguje to i u matic, u datovych ramcu je to zradnejsi v tom, ze pri vyberu radku tohle neprobehne. (Nemuze, protoze radek datoveho ramce muze obsahovat hodnoty ruznych typu - cili bez konverze typu z nich nejde udelat vector, leda seznam, a protoze je datovy ramec taky seznam, zustane datovy ramec)
> # situace u matic:
> a <- matrix(1:6, 2, 3)
> a
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> class(a)
[1] "matrix"
> b <- a[1, ]
> b
[1] 1 3 5
> class(b)
[1] "integer"
>
> d <- a[ ,1]
> d
[1] 1 2
> class(d)
[1] "integer"
> e <- a[ , 1, drop= FALSE]
> e
[,1]
[1,] 1
[2,] 2
> class(e)
[1] "matrix"
> #situace u datoveho ramce:
> df <- as.data.frame(a)
> df
V1 V2 V3
1 1 3 5
2 2 4 6
> class(df)
[1] "data.frame"
> # u sloupcu konverze probehne:
> f <- df[ ,2]
> f
[1] 3 4
> class(f)
[1] "integer"
> # lze ji zamezit:
> g <- df[ , 2, drop= FALSE]
> g
V2
1 3
2 4
> class(g)
[1] "data.frame"
> # u radku konverze neprobehne:
> h <- df[1, ]
> h
V1 V2 V3
1 1 3 5
> class(h)
[1] "data.frame"
> #lze ji vynutit:
> i <- unlist(h)
> i
V1 V2 V3
1 3 5
> class(i)
[1] "integer"
> #kdyz o tom clovek nevi, muze se mu stat tohle:
> mean(h)
[1] NA
Warning message:
In mean.default(h) : argument is not numeric or logical: returning NA
Posledni vec, jen kosmeticka:
T sice funguje jako TRUE a F jako FALSE, ale rozhodnete si, co je pro prehlednost kodu lepsi.
Já ho prásknu, on také učí erko. :-)
S tím výběrem z datového rámce bych ukázal příklad s testovacími daty:
> languages <- data.frame(
+ id = c (1:9),
+ name = c("C", "Java", "Python", "C++", "C#", "Visual Basic", "JavaScript", "PHP", "R"),
+ usage = c(15.95, 13.48, 10.47, 7.11, 4.58, 4.12, 2.54, 2.49, 2.37),
+ change = c(0.74, -3.18, 0.59, 1.48, 1.18, 0.83, 0.41, 0.62, 1.33),
+ stringsAsFactors = FALSE
+ )
> languages # Všimněte si, že to neobaluji do print(...) :-)
id name usage change
1 1 C 15.95 0.74
2 2 Java 13.48 -3.18
3 3 Python 10.47 0.59
4 4 C++ 7.11 1.48
5 5 C# 4.58 1.18
6 6 Visual Basic 4.12 0.83
7 7 JavaScript 2.54 0.41
8 8 PHP 2.49 0.62
9 9 R 2.37 1.33
> class(languages["name"])
[1] "data.frame" # datový rámec jako původní zdroj
> class(languages$name)
[1] "character" # vektor
> class(languages[2])
[1] "data.frame" # datový rámec jako původní zdroj
> languages[3]
usage
1 15.95
2 13.48
3 10.47
4 7.11
5 4.58
6 4.12
7 2.54
8 2.49
9 2.37
> languages["name"]
name
1 C
2 Java
3 Python
4 C++
5 C#
6 Visual Basic
7 JavaScript
8 PHP
9 R
> languages$name
[1] "C" "Java" "Python" "C++" "C#"
[6] "Visual Basic" "JavaScript" "PHP" "R"
> languages[2]
name
1 C
2 Java
3 Python
4 C++
5 C#
6 Visual Basic
7 JavaScript
8 PHP
9 R
Možná bych ještě zdůraznil, že ty faktory jsou děsně užitečné, protože se dají snadno použít na třídění, třeba pro krabicové grafy:
langs <- data.frame(languages["name"], languages["usage"])
> langs <- rbind(data.frame(langs$name, jitter(langs$usage)),
data.frame(langs$name, jitter(langs$usage)),
data.frame(langs$name, jitter(langs$usage)),
data.frame(langs$name, jitter(langs$usage)),
data.frame(langs$name, jitter(langs$usage)))
> langs
langs.name jitter.langs.usage.
1 C 15.948595
2 Java 13.487646
3 Python 10.473382
4 C++ 7.117757
5 C# 4.574903
6 Visual Basic 4.119771
7 JavaScript 2.533762
8 PHP 2.481331
9 R 2.378226
10 C 15.955915
11 Java 13.484478
12 Python 10.472911
13 C++ 7.103522
14 C# 4.583332
15 Visual Basic 4.129590
16 JavaScript 2.530045
17 PHP 2.496101
18 R 2.366824
19 C 15.955425
20 Java 13.488209
21 Python 10.477087
22 C++ 7.112658
23 C# 4.583441
24 Visual Basic 4.119844
25 JavaScript 2.531923
26 PHP 2.491034
27 R 2.362223
28 C 15.943325
29 Java 13.488028
30 Python 10.461460
31 C++ 7.110751
32 C# 4.578946
33 Visual Basic 4.121060
34 JavaScript 2.534422
35 PHP 2.486563
36 R 2.379705
37 C 15.949777
38 Java 13.484966
39 Python 10.461877
40 C++ 7.110917
41 C# 4.574754
42 Visual Basic 4.113257
43 JavaScript 2.540743
44 PHP 2.494350
45 R 2.366082
boxplot(langs$jitter.langs.usage.~langs$langs.name)
Je to poněkud humpolácké, ale jako ukázka to snad stačí. :-)