假设我有一个嵌套在数据帧中的一个或两个级别的向量。 是否有一种快速而肮脏的方式来访问最后一个值,而不使用length()函数? PERL的$# special var?

所以我想要像:

dat$vec1$vec2[$#]

代替

dat$vec1$vec2[length(dat$vec1$vec2)]

===============>>#1 票数:332

我用tail函数:

tail(vector, n=1)

x[length(x)]成语不同, tail好处是它也适用于数据帧。

===============>>#2 票数:144

为了回答这个问题,不是从美学但以绩效为导向的观点,我已经将所有上述建议都放在基准测试中 确切地说,我已经考虑了这些建议

  • x[length(x)]
  • mylast(x) ,其中mylast是通过Rcpp实现的C ++函数,
  • tail(x, n=1)
  • dplyr::last(x)
  • x[end(x)[1]]]
  • rev(x)[1]

并将它们应用于各种大小的随机向量(10 ^ 3,10 ^ 4,10 ^ 5,10 ^ 6和10 ^ 7)。 在我们查看数字之前,我认为应该清楚的是,任何因输入大小更大而变得明显变慢的东西(即任何不是O(1)的东西)都不是一种选择。 这是我使用的代码:

Rcpp::cppFunction('double mylast(NumericVector x) { int n = x.size(); return x[n-1]; }')
options(width=100)
for (n in c(1e3,1e4,1e5,1e6,1e7)) {
  x <- runif(n);
  print(microbenchmark::microbenchmark(x[length(x)],
                                       mylast(x),
                                       tail(x, n=1),
                                       dplyr::last(x),
                                       x[end(x)[1]],
                                       rev(x)[1]))}

它给了我

Unit: nanoseconds
           expr   min      lq     mean  median      uq   max neval
   x[length(x)]   171   291.5   388.91   337.5   390.0  3233   100
      mylast(x)  1291  1832.0  2329.11  2063.0  2276.0 19053   100
 tail(x, n = 1)  7718  9589.5 11236.27 10683.0 12149.0 32711   100
 dplyr::last(x) 16341 19049.5 22080.23 21673.0 23485.5 70047   100
   x[end(x)[1]]  7688 10434.0 13288.05 11889.5 13166.5 78536   100
      rev(x)[1]  7829  8951.5 10995.59  9883.0 10890.0 45763   100
Unit: nanoseconds
           expr   min      lq     mean  median      uq    max neval
   x[length(x)]   204   323.0   475.76   386.5   459.5   6029   100
      mylast(x)  1469  2102.5  2708.50  2462.0  2995.0   9723   100
 tail(x, n = 1)  7671  9504.5 12470.82 10986.5 12748.0  62320   100
 dplyr::last(x) 15703 19933.5 26352.66 22469.5 25356.5 126314   100
   x[end(x)[1]] 13766 18800.5 27137.17 21677.5 26207.5  95982   100
      rev(x)[1] 52785 58624.0 78640.93 60213.0 72778.0 851113   100
Unit: nanoseconds
           expr     min        lq       mean    median        uq     max neval
   x[length(x)]     214     346.0     583.40     529.5     720.0    1512   100
      mylast(x)    1393    2126.0    4872.60    4905.5    7338.0    9806   100
 tail(x, n = 1)    8343   10384.0   19558.05   18121.0   25417.0   69608   100
 dplyr::last(x)   16065   22960.0   36671.13   37212.0   48071.5   75946   100
   x[end(x)[1]]  360176  404965.5  432528.84  424798.0  450996.0  710501   100
      rev(x)[1] 1060547 1140149.0 1189297.38 1180997.5 1225849.0 1383479   100
Unit: nanoseconds
           expr     min        lq        mean    median         uq      max neval
   x[length(x)]     327     584.0     1150.75     996.5     1652.5     3974   100
      mylast(x)    2060    3128.5     7541.51    8899.0     9958.0    16175   100
 tail(x, n = 1)   10484   16936.0    30250.11   34030.0    39355.0    52689   100
 dplyr::last(x)   19133   47444.5    55280.09   61205.5    66312.5   105851   100
   x[end(x)[1]] 1110956 2298408.0  3670360.45 2334753.0  4475915.0 19235341   100
      rev(x)[1] 6536063 7969103.0 11004418.46 9973664.5 12340089.5 28447454   100
Unit: nanoseconds
           expr      min         lq         mean      median          uq       max neval
   x[length(x)]      327      722.0      1644.16      1133.5      2055.5     13724   100
      mylast(x)     1962     3727.5      9578.21      9951.5     12887.5     41773   100
 tail(x, n = 1)     9829    21038.0     36623.67     43710.0     48883.0     66289   100
 dplyr::last(x)    21832    35269.0     60523.40     63726.0     75539.5    200064   100
   x[end(x)[1]] 21008128 23004594.5  37356132.43  30006737.0  47839917.0 105430564   100
      rev(x)[1] 74317382 92985054.0 108618154.55 102328667.5 112443834.0 187925942   100

这会立即排除涉及revend任何内容,因为它们显然不是O(1) (并且结果表达式以非惰性方式计算)。 taildplyr::lastO(1)不远,但它们也比mylast(x)x[length(x)]慢得多。 由于mylast(x)x[length(x)]慢并且没有任何好处(相反,它是自定义的并且不能优雅地处理空向量),我认为答案很明确: 请使用x[length(x)]

===============>>#3 票数:104

如果你正在寻找像Python的x [-1]符号那样好的东西,我想你运气不好。 标准的习语是

x[length(x)]  

但是写一个函数来做这个很容易:

last <- function(x) { return( x[length(x)] ) }

R中这个缺失的功能也让我很烦恼!

===============>>#4 票数:44

结合lindelofGregg Lind的想法:

last <- function(x) { tail(x, n = 1) }

在提示符下工作,我通常省略n= ,即tail(x, 1)

不同于lastpastecs包, headtail (从utils )工作不仅在载体也对数据帧等,并且也可以返回数据“ 没有第一/最后n个元素 ”,例如

but.last <- function(x) { head(x, n = -1) }

(注意你必须使用head而不是tail 。)

===============>>#5 票数:17

我只是使用以下代码在663,552行的数据框架上对这两种方法进行了基准测试:

system.time(
  resultsByLevel$subject <- sapply(resultsByLevel$variable, function(x) {
    s <- strsplit(x, ".", fixed=TRUE)[[1]]
    s[length(s)]
  })
  )

 user  system elapsed 
  3.722   0.000   3.594 

system.time(
  resultsByLevel$subject <- sapply(resultsByLevel$variable, function(x) {
    s <- strsplit(x, ".", fixed=TRUE)[[1]]
    tail(s, n=1)
  })
  )

   user  system elapsed 
 28.174   0.000  27.662 

因此,假设您正在使用向量,访问长度位置要快得多。

===============>>#6 票数:16

dplyr包中包含一个函数last()

last(mtcars$mpg)
# [1] 21.4

===============>>#7 票数:12

另一种方法是采用反向向量的第一个元素:

rev(dat$vect1$vec2)[1]

===============>>#8 票数:9

我有另一种方法来查找向量中的最后一个元素。 说矢量是a

> a<-c(1:100,555)
> end(a)      #Gives indices of last and first positions
[1] 101   1
> a[end(a)[1]]   #Gives last element in a vector
[1] 555

你去!

===============>>#9 票数:8

data.table包括last函数

library(data.table)
last(c(1:10))
# [1] 10

===============>>#10 票数:7

怎么样

> a <- c(1:100,555)
> a[NROW(a)]
[1] 555

===============>>#11 票数:2

xts包提供了last功能:

library(xts)
a <- 1:100
last(a)
[1] 100

  ask by user14008 translate from so

未解决问题?本站智能推荐:

2回复

从列表中向量中的最后一个元素创建一个列表

假设我有一个向量list (它们都不为空;它们的长度可能不同)。 如何从向量的两端(例如)生成元素列表? 例如,如果我的列表中包含3个元素, 1:10 , 2:9和c(3,5)则输出列表应该包含列表10 , 9和5 。 在更简单的情况下,所有向量的长度都相同(例如5),我尝试首
1回复

生成向量:当一个向量中的值与另一个向量匹配时,在R中相同位置输入另一个向量的值

我正在尝试根据另一个数据帧中的向量在R中的数据帧中创建一个新向量。 我有一个包含插座号的数据框。 另一个数据框(一致性表)显示哪个出口名称与哪个出口编号相对应。 使用一致性表,我想在我的第一个数据框中找到每个相关插座编号的插座名称,并将它们作为新矢量放入第一个数据框中。 这是我的
2回复

我有一个带有向量列的数据框。 我想获取最后一个元素并将其存储在新列中。 我该怎么做?

我有看起来像这样的数据框 我想要一个看起来像这样的数据框
4回复

NA之前的第一个和最后一个值

我试图在向量中的NA值之前获取不同段的第一个和最后一个值。 这是一个例子: 反过来,我的结果我们会1; 11和13; 15和44; 61和119; 122。
3回复

查找向量中存在的列并替换等于1的值

我有一个二进制数据集,看起来像 和一个向量 我想要一个命令来搜索姓氏并更改这些列中的值。 例如将1更改为A。因此输出为:
2回复

R:以向量中的值命名data.frame

我正在尝试在for循环中创建一个data.frame。 我想以该循环迭代的向量中的任何值命名data.frame。 向量来自State框架中的City列: 我尝试过的 这将命名data.frame i不是在向量中的值。 如果这是循环中的第一次迭代,那么我希望dat
2回复

根据数据帧中的值构造向量

我有以下数据: 由此,我想构造一个向量,其向量为Mean ,索引由start和end决定。 换句话说,向量从索引1到索引10的条目将为0.04349 ,然后向量从索引11到25的条目的值为0.12 , 0.04349 。这是预期的结果: 但是我在上面获得它的方式效率很低,尤
3回复

如何用向量中的重复值填充新变量?

我有一个值向量: 我在数据框中有一个变量: 如何在数据帧中的新变量中将值向量中的每个值重复n次,从而得到以下信息:
1回复

基于数据帧中另一个字符向量的向量中的条件替换

我有一个称为“突变”的数据框。 它们可以是SNP(如“ C> A”),插入(如“ + TTTAAG”)或删除(如“ -CTTGA”)。 例如: 我想让R在突变列(“>,” +“或”-“)中搜索特定字符,并将” SNP“,”插入“或”删除“分别写入数据帧的新列中,所以我期望
2回复

使用其他两个向量中的TRUE值的索引有条件地填充向量

我有两个TRUE / FALSE值向量: 我想在x1和x2中获取TRUE值的索引,并分别在这些索引中用0.75和-0.25填充新向量。 所有其他单元格将为0 。 因此,最终向量在索引-0.25和0.75中分别具有0.75和在索引-0.25中具有-0.25 。 如何在R中实