测试一下R一些常用的数字处理函数.
如下 :
round, 四舍五入到小数点后几位.
例如
> round(x,1)
x y z
1 0.0 0.0 0.0
2 0.0 0.2 0.5
3 0.8 0.9 0.8
4 0.3 0.6 1.0
5 0.4 0.8 0.4
6 0.3 0.9 0.8
sort, 正向排序
rev, 返向排序 (注意要得到按顺序的反向排序, 需要rev(sort(?)))
> x <- 1:10
> y <- rep(x, each=2)
> y <- rep(x, times=2)
> y
[1] 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
> sort(y)
[1] 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
> rev(sort(y))
[1] 10 10 9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1
> rev(y)
[1] 10 9 8 7 6 5 4 3 2 1 10 9 8 7 6 5 4 3 2 1
rank和scale见:
http://blog.163.com/digoal@126/blog/static/163877040201533335228/
http://blog.163.com/digoal@126/blog/static/16387704020153343446995/
log(x, base) , 以base为底的x的对数. 默认是e
> log(100,2)
[1] 6.643856
> log(100,10)
[1] 2
> 2^6.643856
[1] 99.99999
pmin,
pmax,
多个向量, 每个位置对应处的, 最大值或最小值.
例如
> x
[1] 1 2 3 4 5 6 7 8 9 10
> y <- rev(sort(x))
> x
[1] 1 2 3 4 5 6 7 8 9 10
> y
[1] 10 9 8 7 6 5 4 3 2 1
位置对应
> pmin(x,y)
[1] 1 2 3 4 5 5 4 3 2 1
> pmax(x,y)
[1] 10 9 8 7 6 6 7 8 9 10
最好是长度一样的向量进行计算, 否则会告警.
> pmax(x,y,z)
[1] 10 11 12 13 14 15 16 17 18 19 20 21 22
Warning message:
In pmax(x, y, z) : an argument will be fractionally recycled
cumsum, 截至到每个位置处的累计和
cumprod, 截至到每个位置处的累计积
cummin, 截至到每个位置处的最小值
cummax, 截至到每个位置处的最大值
> x
[1] 1 2 3 4 5 6 7 8 9 10
> cumsum(x)
[1] 1 3 6 10 15 21 28 36 45 55
1 , 1+2 , 1+2+3 , .....
> cumprod(x)
[1] 1 2 6 24 120 720 5040 40320 362880
[10] 3628800
1, 1*2, 1*2*3, ....
> cummin(x)
[1] 1 1 1 1 1 1 1 1 1 1
min(1), min(1,2), min(1,2,3),...
> cummax(x)
[1] 1 2 3 4 5 6 7 8 9 10
max(1), max(1,2), max(1,2,3),...
match(x,y), 返回和第一个向量长度一致的向量, 表示x的值在Y中的位置索引.
> x
[1] 5 6 7 8 9 10 11 12 13 14 15 16
> y
[1] 10 9 8 7 6 5 4 3 2 1
> match(x,y)
[1] 6 5 4 3 2 1 NA NA NA NA NA NA
5在y的位置是6. 即y[6]==x[1]
which (x == a) , x 是一个向量, a是一个值, 如果x中有值与a匹配, 那么返回索引位置.
> x
[1] 10 10 9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1
> which(x == 1)
[1] 19 20
注意y不要使用向量
> which(x == c(1,3,100))
[1] 19
Warning message:
In x == c(1, 3, 100) :
longer object length is not a multiple of shorter object length
choose(n,k) , 二项分布值.
lchoose(n,k) , 二项分布值的E为底的对数.
算法区分k>0, k=0, k<0的情况, 如下 :
n(n-1)...(n-k+1) / k!,
as 1 for k = 0
as 0 for negative k.
k如果不是整数, 则取round值.
例子
> choose(4,3)
[1] 4
> (4*3*2)/(3*2*1)
[1] 4
lchoose则返回choose结果绝对值的对数.
> choose(10,2)
[1] 45
> lchoose(10,2)
[1] 3.806662
> log(45)
[1] 3.806662
参考帮助 :
The functions ‘choose’ and ‘lchoose’ return binomial coefficients
and the logarithms of their absolute values. Note that ‘choose(n,
k)’ is defined for all real numbers n and integer k. For k >= 1
it is defined as n(n-1)...(n-k+1) / k!, as 1 for k = 0 and as 0
for negative k. Non-integer values of ‘k’ are rounded to an
integer, with a warning.
‘choose(*, k)’ uses direct arithmetic (instead of ‘[l]gamma’
calls) for small ‘k’, for speed and accuracy reasons. Note the
function ‘combn’ (package ‘utils’) for enumeration of all possible
combinations.
na.omit(x), 忽略向量中的NA值, 如果X是矩阵或数据框, 则忽略整行.
na.fail(x), 如果x 中包含NA值, 则返回错误.
> na.fail(c(1,2,3,NA))
Error in na.fail.default(c(1, 2, 3, NA)) : missing values in object
> na.omit(c(1,2,3,NA,4))
[1] 1 2 3 4
attr(,"na.action")
[1] 4
attr(,"class")
[1] "omit"
unique(x), 去重复数据.
> unique(c(1,1,1,1,2,3,4,4))
[1] 1 2 3 4
对于数据框, 则去除重复行
> x <- data.frame(rep(1:2, each=2),rep(1:2, each=2))
> x
rep.1.2..each...2. rep.1.2..each...2..1
1 1 1
2 1 1
3 2 2
4 2 2
> unique(x)
rep.1.2..each...2. rep.1.2..each...2..1
1 1 1
3 2 2
table(x) , 返回重复数据的个数的表格.
> x <- data.frame(rep(6:8, each=2),rep(5:7, each=2))
> x
rep.6.8..each...2. rep.5.7..each...2.
1 6 5
2 6 5
3 7 6
4 7 6
5 8 7
6 8 7
> table(x)
rep.5.7..each...2.
rep.6.8..each...2. 5 6 7
6 2 0 0
7 0 2 0
8 0 0 2
table(x,y) ,
返回x,y的列联表, 输入值为两个factor, 并且长度必须一致
> x <- gl(1,10)
> y <- gl(10,2)
> x
[1] 1 1 1 1 1 1 1 1 1 1
Levels: 1
> y
[1] 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
Levels: 1 2 3 4 5 6 7 8 9 10
> table(x,y)
Error in table(x, y) : all arguments must have the same length
> y <- gl(10,1)
> table(x,y)
y
x 1 2 3 4 5 6 7 8 9 10
1 1 1 1 1 1 1 1 1 1 1
> mode(table(x,y))
[1] "numeric"
subset(x, ...), 给定条件的子集
> z
[1] 10 11 12 13 14 15 16 17 18 19 20 21 22
> subset(z, z>1)
[1] 10 11 12 13 14 15 16 17 18 19 20 21 22
> subset(z, z>15)
[1] 16 17 18 19 20 21 22
> x <- data.frame(1:10, 5:14, 6:15)
> x
X1.10 X5.14 X6.15
1 1 5 6
2 2 6 7
3 3 7 8
4 4 8 9
5 5 9 10
6 6 10 11
7 7 11 12
8 8 12 13
9 9 13 14
10 10 14 15
> subset(x, x$X1.10>5)
X1.10 X5.14 X6.15
6 6 10 11
7 7 11 12
8 8 12 13
9 9 13 14
10 10 14 15
sample(x, size), x可以是向量或列表, 从x中采样size个元素, 如果是列表, 采样表示列数.
> x
rep.6.8..each...2. rep.5.7..each...2.
1 6 5
2 6 5
3 7 6
4 7 6
5 8 7
6 8 7
> mode(x)
[1] "list"
> length(x)
[1] 2
> sample(x, 1)
rep.5.7..each...2.
1 5
2 5
3 6
4 6
5 7
6 7
> z
[1] 10 11 12 13 14 15 16 17 18 19 20 21 22
> sample(z, 5)
[1] 21 13 22 14 15
另外还有两个可选参数prob, replace.
prob是一个长度和x的长度一致的向量, 每个位置对应采样倾向度, 越大则越可能被选择, 0表示排除.
例如 :
> z-10
[1] 0 1 2 3 4 5 6 7 8 9 10 11 12
以下prob表示z的第一个元素10不可能被采样选择.
> sample(z, 5, prob=z-10)
[1] 16 13 12 20 17
replace=TRUE表示可能出现采样重复值.
> sample(z, 5, prob=z-10, replace=TRUE)
[1] 18 12 15 22 14
> sample(z, 5, prob=z-10, replace=TRUE) , 因为21,22对应的prod最大, 可能性最大.
[1] 21 21 21 18 11
时间: 2024-11-02 22:47:22