2

列がたくさんある data.frame があります。そのうちの 1 つにはサンプル領域のコードがあり、もう 1 つにはサンプルの番号があります。各サンプル領域の最後から 2 番目のサンプルからの情報をサブセット化したいと考えています。私はさまざまなことを試しました...最終的にはこれが私の最善の推測です...しかし、まだ機能していません.

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
   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


コードは何をしますか?

関数を分解して、できる限り説明します。の行を見るとidx <- ...、関数はシーケンス(ここでは) を列でtapply分割しています。あれは: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 

ここで、関数の代わりに、これらの各要素の最後から 2 つ目の要素がc必要です。そのため、これらのそれぞれが 1 つずつ渡され、コードが最後から 2 つ前の要素を毎回選択するを作成します。これらは、最後から 2 番目のすべての行の行インデックスを示します。したがって、data.frame を でサブセット化するだけです。function(x) x[length(x)-1]A, B, C, Dx[length(x)-1]mydata[idx, ]

于 2013-05-07T16:26:10.743 に答える