2

我有一个包含很多列的 data.frame,其中一个具有示例区域的代码,另一个具有示例的编号。我想从每个样本区域的倒数第二个样本中对信息进行子集化。我尝试了很多不同的东西......最后这是我最好的猜测......但它仍然无法正常工作。

site <- sample (1:3, 10, replace= T)
d2 <- sample (1:5, 10, replace= T)
d3 <- sample (1:5, 10, replace= T)
samplet <- sample (1:4, 10, replace= T)
mydata <- data.frame (cbind(site, d2, d3, samplet))

penultimate <- matrix(NA,,) # here I dont know how the return will be, as I dont know    how the dataframe will change
si <- matrix (NA, , )  
pl <- unique (site)
for (i in 1:(length (pl))) {
    si <-  mydata[which (samplet==pl[i]),] # I tried to create a temporary matrix, so I can calculate each site at a time
    penultimate <- si[which (si$samplet!=(max(si$samplet[si$samplet!=max(si$samplet)]))),]
}

干杯!

4

3 回答 3

4

一个简单的方法是使用data.table和它的内在.N价值

# assuming `d1` is the column from which you want to find the penultimate

mydata <- data.frame(d1=strsplit("AAABBCCCCCDD", "")[[1]], d2=rnorm(12), d3=LETTERS[1:12], d4=c(101:103, 201:202, 301:305, 401:402))

DT <- data.table(mydata)

DT[, .SD[.N-1], by=d1]

   d1         d2 d3  d4
1:  A  1.6906714  B 102
2:  B -0.1239458  D 201
3:  C -0.2976339  I 304
4:  D  0.6858120  K 401

与 mydata 比较

> mydata
   d1         d2 d3  d4
1   A  0.5986002  A 101
2   A  1.6906714  B 102   <~~~~  \
3   A -0.3253657  C 103
4   B -0.1239458  D 201   <~~~~   -\
5   B  0.8261401  E 202
6   C  0.0601318  F 301             Penultimate Values by d1
7   C -0.9766622  G 302
8   C  0.1028259  H 303
9   C -0.2976339  I 304   <~~~~~  -/ 
10  C -1.1467000  J 305
11  D  0.6858120  K 401   <~~~~~  / 
12  D -0.6160335  L 402

编辑,用新的样本数据更新。

于 2013-05-07T16:08:10.390 回答
1

这是tapply使用@Ricardo 数据的解决方案:

# data (thanks @Ricardo)
set.seed(1234)
mydata <- data.frame(d1=strsplit("AAABBCCCCCDD", "")[[1]], 
             d2=rnorm(12), d3=LETTERS[1:12], 
             d4=c(101:103, 201:202, 301:305, 401:402))

# solution
idx <- unlist(tapply(seq_len(nrow(mydata)), mydata$d1, function(x) x[length(x)-1]))
mydata[idx, ]
#    d1         d2 d3  d4
# 2   A  0.2774292  B 102
# 4   B -2.3456977  D 201
# 9   C -0.5644520  I 304
# 11  D -0.4771927  K 401

如果unlist. 的特定值只有 1 行,则需要id1.


代码有什么作用?

我将通过破坏该功能尽可能好地解释。查看 line idx <- ...,该函数按 columntapply拆分序列c(1, 2, ... nrow(mydata))(此处为) 。那是:nrow(mydata) = 12mydata$d1

tapply(1:12, mydata$d1, c) # just to show what happens here
$A
[1] 1 2 3

$B
[1] 4 5

$C
[1]  6  7  8  9 10

$D
[1] 11 12 

c现在,我们需要每个元素的最后一个元素,而不是函数。因此,我们创建一个function(x) x[length(x)-1]其中的每一个都A, B, C, D一个一个传递,并且代码每次都x[length(x)-1]选择最后一个元素。这些为您提供了所有倒数第二行的行索引。因此,只需将 data.frame 子集化。mydata[idx, ]

于 2013-05-07T16:26:10.743 回答
0

除了前面的答案,也可以这样做dplyr

set.seed(1234)
mydata <- data.frame(d1=strsplit("AAABBCCCCCDD", "")[[1]], 
                 d2=rnorm(12), d3=LETTERS[1:12], 
                 d4=c(101:103, 201:202, 301:305, 401:402))

require(dplyr)

mydata %.%                 
  group_by(d1) %.% 
  mutate(count = 1:n()) %.% 
  filter(count %in% max(c(count-1,1))) %.%   
  select(-count)

正如@BondedDust 的回答一样,如果任何给定的 d1“组”只有一行,我假设您使用单独的行

于 2014-05-12T17:45:48.967 回答