如何在 R 中从中间索引开始切片数据直到末尾而不使用 `length` 函数(就像在 Python 中一样)?

60
在Python中,我可以像这样从五项列表中提取(拉取值)最后四个项目:mylist[1:](请注意,基于0的索引)。在R中,似乎在冒号后面没有任何东西是一个错误。在两种语言中,我都可以将最后一个参数作为列表的长度,但这并不总是方便(例如内联切片:colnames(iris)[2:length(colnames(iris))])。
在R中是否有类似的语法?

5
我确实想念Python的切片语法,但至少有一些快捷方式可以减少输入的次数,比如nrowncol,例如:colnames(iris)[2:ncol(iris)] - Marius
2个回答

59
这可能会让有Python背景的人感到困惑,但是mylist[-1]似乎可以解决问题。在这种情况下,负号可以被理解为“除了”,即除了第一列,取其他所有内容。因此,colnames(iris)[-1]可以用来获取除第一个项目以外的所有内容。
哦,如果要排除更多的项目,请将其视为被排除的范围,因此colnames(iris)[-2:-4]只会保留第一个和第五个及之后的所有项目。
对于其他从Python过来的人,可以查看这个漂亮的幻灯片比较R和Python

8
你可以使用 colnames(iris)[-(1:5)] 作为示例。 - Ricardo Saporta
9
@RomanLuštrik :-) 我真希望能找到一本“为 Python 程序员介绍 R 语言”的书! - Pat
2
你也可以使用 head(colnames(iris), -1)headtail 函数可用于截断向量并允许负参数。 - Karsten W.
我认为,明确说明mylist[-(1:5)]的含义会有所帮助,它返回第六个及以后的元素(基于1),就像Python中的mylist[5:]一样(基于0)。 - Josiah Yoder

40

在R中,tail(mylist, -2)的作用与Python中的 mylist[2:]相同。


2
挑剔一点,因为R中的列表是1索引,所以等价于tail(mylist, -2 + 1) - rwb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接