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

8.2 喀迈拉(no.31~no.40)8 2 喀迈拉 no 31 no 40 8 2 31 subset 函数 subset 是为了在交互使用中提供便利 在函数中使用时却经常造成不便和困扰 在使用函数时 使用下标 不要使用 subset 病人 医生 当我做这个的时候就疼 医生 那就不要做这个啊

大家好,我是讯享网,很高兴认识大家。

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
小讯
上一篇 2025-01-24 13:15
下一篇 2025-01-17 08:07

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/27805.html