8.2 喀迈拉(no.31~no.40)

8.2 喀迈拉(no.31~no.40)

8.2.31 subset

函数subset是为了在交互使用中提供便利。在函数中使用时却经常造成不便和困扰。在使用函数时,使用下标,不要使用subset

病人:医生,当我做这个的时候就疼。
医生:那就不要做这个啊。

这是一个subset在操作中的例子:

> xdf5 <- data.frame(R=1:2, J=3:4, E=5:6, K=7:8)
> subset(xdf5, select=J:K)
  J E K
1 3 5 7
2 4 6 8
> subset(xdf5, select=-E)
  R J K
1 1 3 7
2 2 4 8

参数允许使用非常不标准的":""-"操作。这在交互使用中会提供方便快捷的作用。用户期待这种小技巧可也以在其他环境中使用是一个坟墓级的危险。即使是在交互应用中,期待J:K按照字母表而不是数据框中的顺序也是非常危险的。

注意即使只有一列被选出来,subset也会返回一个数据框。

8.2.32 subset中的===

在下边两个命令中有非常大的不同:

subset(Theoph, Subject = 1)

subset(Theoph, Subject == 1)

最后是我们所期待的,前者不会做任何事情。

8.2.33 单独的sample选择

函数sample有一个并不是永远都有帮助的有帮助的特点。它的第一个参数可以是从抽要起点到终点的条目,也可以待选数据中的数字。这就是制造摩擦之处。

> sample(c(4.9, 8.6), 9, replace=TRUE)
[1] 4.9 4.9 8.6 4.9 8.6 4.9 8.6 4.9 8.6
> sample(c(4.9), 9, replace=TRUE)
[1] 2 3 3 2 4 4 3 4 1

如果数据是数值型的,最小是1并且长度是一(由于,这么说,在一个函数中选择),那么它就被解释为抽样上限。注意上例中数据会被向下调整为离其最近的整数。

这是一个复杂的组合代码,可以制造字符型的数据。

> as.numeric(sample(as.character(c(4.9)), 9, replace=TRUE))
[1] 4.9 4.9 4.9 4.9 4.9 4.9 4.9 4.9 4.9

8.2.34 改变部分的名称

R在深挖取代声明时做的很好。比如,下述确实做了我们期待的事情:

names(mylist$b[[1]]) <- letters[1:10]

但有可能是错误的。这是个例子:

> right <- wrong <- c(a=1, b=2)
> names(wrong[1]) <- ’changed’
> wrong
a b
1 2
> names(right)[1] <- ’changed’
> right
changed b
      1 2

错误之处在于我们改掉名字之后却把它扔了。因此为了改变在我们愚蠢的例子中的前两个名字,我们应该这样做:

names(mylist$b[[1]])[1:2] <- LETTERS[1:2]

8.2.35 一个困惑

> class(dfxy)
[1] "data.frame"
> length(dfxy)
[1] 8
> length(as.matrix(dfxy))
[1] 120

这是什么:

nrow(dfxy)

8.2.36 另外一个困惑

如果一下是一个有效的命令:

weirdFun()()()

它会返回什么?
写一个例子吧。

8.2.37 数据框和矩阵(I)

一个矩阵和一个数据框当打印出来的时候看起来一样。很好—它们在概念上非常相似。但是,实现上确实完全不同。概念相似实现却不同的对象是一个好的造成困扰的源泉。

> x %*% y
Error in x %*% y : requires numeric matrix/vector arguments

问题是x看起来像矩阵,但是实际是一个数据框。一个解决方案是使用as.matrix,或者data.matrix

理论上数据框的实现细节不应该给使用者造成麻烦。理论经常有一些粗糙的边缘啦。

8.2.38 apply不适用于数据框

一个粗糙的边缘是在数据框上应用apply函数。apply函数经常不会按照我们的期望那样做事,因为在进行运算是它会强制将数据框转换为矩阵。

apply(myDataFrame, 2, class) # not right

实际上数据框是被当做列表来实现的,列表的每一个组件是数据框的一列。因此:

lapply(myDataFrame, class)

会如你所愿。

8.2.39 数据框和矩阵(II)

考虑这个命令:

array(sample(x), dim(x))

这会改变矩阵的元素序列。如果x是一个数据框,这个命令会运行但是几乎不会得到你想要的。

可以这样获得一个数据框的一列:

x$B

如果你在一个矩阵上试这个你将会得到类似的错误:

Error in x$B : $ operator is invalid for atomic vectors

如果你的x可能是数据框也可能是矩阵,这样会更好:

x[, ’B’] 

另一方面,如果你想排除是一个矩阵的可能性,'$'将会时更好的选择。

在数据框上进行操作会比在相应的矩阵上操作更慢。在一个实时性要求较高的情况下,将数据框转换为矩阵将会提升四倍的速度。

越简单越好。

8.2.40 数据框和矩阵的名字

数据框的名字和相应的矩阵的名字是不同的。数据框的名字是列的名字,矩阵的名字是个体元素的名字。

一致的名字是:

  • rownames
  • colnames
  • dimnames
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值