• R语言
  • 发个学习贴,新手可以进来看看一些问题的理解

3.which()

which可以很方便的用来寻找一些符合固定条件的下标,比如我想找x=c(1,2,3,4,5,1,8)这里面第2个等于1的位置:

which(x==1)[2],抛砖引玉,希望能给大家启发

4.apply函数

很多人知道apply函数可以对矩阵进行操作,下复制一个例子,更好的启发大家的思路:

> z<br />
     [,1] [,2]<br />
[1,]    1    4<br />
[2,]    2    5<br />
[3,]    3    6<br />
> f <- function(x) x/c(2,8)<br />
> y <- apply(z,1,f)<br />
> y<br />
     [,1]  [,2] [,3]<br />
[1,]  0.5 1.000 1.50<br />
[2,]  0.5 0.625 0.75<br />
t(apply(z,1,f))


通过这个例子,我们可以自己编写一些简单的function来对矩阵操作,当然最常见的apply(z,2,mean),我们的目的就是通过自编的function来替代mean做些更复杂的事情
</p>

5.complete.cases()

很多时候我们想去掉NA的情形:

> d4<br />
     kids states<br />
1    Jack     CA<br />
2    <NA>     MA<br />
3 Jillian     MA<br />
4    John   <NA>


我们就可以用
> d5 <- d4[complete.cases(d4),]<br />
> d5<br />
     kids states<br />
1    Jack     CA<br />
3 Jillian     MA


也许可以给大家处理实际问题带来启发
</p>

6.merge()函数

这个函数我觉得很好用,比如我有2个数据框:

> d1<br />
     kids states<br />
1    Jack     CA<br />
2    Jill     MA<br />
3 Jillian     MA<br />
4    John     HI<br />
> d2<br />
  ages    kids<br />
1   10    Jill<br />
2    7 Lillian<br />
3   12    Jack


然后我想通过同一个变量把2个数据框合并:
> d <- merge(d1,d2)<br />
> d<br />
  kids states ages<br />
1 Jack     CA   12<br />
2 Jill     MA   10


挺好用的吧!
</p>

7.split()函数

> g <- c("M","F","F","I","M","M","F")<br />
> split(1:7,g)<br />
$F<br />
[1] 2 3 7<br />
$I<br />
[1] 4<br />
$M<br />
[1] 1 5 6


有了这个示范,相信大家可以做很多事情了。
</p>

回复 第4楼 的 superdesolator:

非常感谢分享,这些总结对于初学者来说会很有帮助。

在第5点里面,有个更简单的用法是

na.omit(d4)
</p>

另外继续更新的时候把代码放在[code][/code]中会更美观。[s:17]

回复 第2楼 的 superdesolator:作为一名新手,我数次犯如下错误:

<br />
for (i in 1:n-1) #这里 n-1 应该写成 (n-1) 才对<br />
{<br />
    print("Hello World!")<br />
}<br />
</p>

引以为戒。

回复 第9楼 的 Peter Chen:握爪。。有一次写代码debug了很久还是报错。。这个小错误对于编程新手也许真的很容易忽视。。

同搭船, try()函数

上次在一份帖子里提过,这次再拿出来共享一下。

<br />
x <- list(10, 20, "a", "b", 30, 40)<br />
z <- list(0)<br />
y <- list(0)<br />
for (i in 1:length(x)){<br />
  z[[i]] <- log(x[[i]])<br />
}<br />
z<br />
# 提示错误,停止运行<br />
# 错误于log(x[[i]]) : 数学函数中用了非数值参数<br />
# > z<br />
# [[1]]<br />
# [1] 2.302585<br />
#<br />
# [[2]]<br />
# [1] 2.995732<br />
for (i in 1:length(x)){<br />
  y[[i]] <- try(log(x[[i]]), F)<br />
}<br />
y<br />
# 提示错误,继续运行<br />
# Error in log(x[[i]]) : 数学函数中用了非数值参数<br />
# Error in log(x[[i]]) : 数学函数中用了非数值参数<br />
# > y<br />
# [[1]]<br />
# [1] 2.302585<br />
#<br />
# [[2]]<br />
# [1] 2.995732<br />
#<br />
# [[3]]<br />
# [1] "Error in log(x[[i]]) : 数学函数中用了非数值参数\n"<br />
# attr(,"class")<br />
# [1] "try-error"<br />
# attr(,"condition")<br />
# <simpleError in log(x[[i]]): 数学函数中用了非数值参数><br />
#<br />
# [[4]]<br />
# [1] "Error in log(x[[i]]) : 数学函数中用了非数值参数\n"<br />
# attr(,"class")<br />
# [1] "try-error"<br />
# attr(,"condition")<br />
# <simpleError in log(x[[i]]): 数学函数中用了非数值参数><br />
#<br />
# [[5]]<br />
# [1] 3.401197<br />
#<br />
# [[6]]<br />
# [1] 3.688879<br />
</p>

还有这个

<br />
for (i in 1:3) {<br />
  print("select i")<br />
}<br />
for (i in 1:3) {<br />
  print(paste("select", i))<br />
}<br />


这里还是print(),容易看出来,是要把循环变量放到引号外再用paste连接,如果是要批量生成命令,有时候都不知道是这里出的错误。
</p>

8.get()函数

这个函数也是很好用的!看下面的循环

<br />
a=c(1,2,3)<br />
b=c(4,5,6)<br />
for(n in c("a","b")) print(n)<br />
for(n in c("a","b")) print(get(n))</p>
<p>


相信大家能好好体会吧!如果a,b是2个文件名的时候,可以print(scan(n))
</p>

9.pmin()函数

比如:我们想得到

a=c(1,2,3)

b=c(2,0,4)

中的最小,我们可以min(a,b)得到结果0,但是大家用下pmin(a,b)会得到什么呢?

回复 第15楼 的 superdesolator:不错。学无止尽[s:13]

10.order()函数

比如我有:d=data.frame(kids=c("a","b","c"),ages=c(2,6,4))

> d

kids ages

1 a 2

2 b 6

3 c 4

我现在想根据ages从小到大排,我们可以:

d[order(d$ages),]

得到:

kids ages

1 a 2

3 c 4

2 b 6

这里保存了第一列与第二列的对应关系,大家可以仔细推敲下d[order(d$ages),]为什么可以这样。

11.cat()函数

今天终于看到cat()函数的用法了:

x=c(1,2,3)

cat(x,sep=c(".","\n","\n"))

看看吧!总的来说它是作为一种输出方式的函数.

12.grep()函数

> grep("Pole",c("Equator","North Pole","South Pole"))

[1] 2 3

> grep("pole",c("Equator","North Pole","South Pole"))

integer(0)

grep(pattern,x)就是在x中找含有pattern的函数,蛮有用的

13.substr()与strsplit()函数

这两个要提下用来扫盲。。

> substring("Equator",3,5)

[1] "uat"

> strsplit("6-16-2011",split="-")

[[1]]

[1] "6" "16" "2011"

14.regexpr()与gregexpr()函数

这2个可能大家比较陌生点:

> regexpr("uat","Equator")

[1] 3

就是在后面的文中找前面的,返回第几个开始

> gregexpr("iss","Mississippi")

[[1]]

[1] 2 5

这个与上面的类似,但找所有的

15.传说中的正则表达式Regular Expressions!

记得几个星期之前,我非常羡慕和想学一个网页抓取数据技术中的用正则表达式整理数据的方法,当时大家都说用正则表达式,我却不知道是什么!现在新手们的福利来了:

前面介绍了grep()的用法了

> grep("[au]",c("Equator","North Pole","South Pole"))

[1] 1 3

这里加了个[]表示找所有含a或者u!

> grep("o.e",c("Equator","North Pole","South Pole"))

[1] 2 3

这里加了个.表示o和e之间多了随便什么字母!2个点就是2个随便什么字母,如下:

> grep("N..t",c("Equator","North Pole","South Pole"))

[1] 2

如果我们想找.本身呢?

> grep(".",c("abc","de","f.g"))

[1] 1 2 3

这样不行,得这样:

> grep("\\.",c("abc","de","f.g"))

[1] 3