2

nametext 列と factorを持つデータフレームがありますcitycity最初に、次に の順にアルファベット順に並べられますnamecityここで、この順序を維持しながら、 each に n 番目の要素のみを含むデータ フレームを取得する必要があります。ループなしできれいな方法で行うにはどうすればよいですか?

私は持っている:

name    city
John    Atlanta
Josh    Atlanta
Matt    Atlanta
Bob     Boston
Kate    Boston
Lily    Boston
Matt    Boston

によって n 番目の要素を返す関数が必要ですcity。つまり、3 番目の場合は、次のようになります。

name    city
Matt    Atlanta
Lily    Boston

選択した の範囲外の場合、つまり 4 番目の場合に返さNULLれます。namecity

name    city
NULL    Atlanta
Matt    Boston

ベースRのみを使用してください。

4

3 に答える 3

5

ベースRで使用by

追加の範囲外の値を含む、いくつかのテストデータを設定します。

test <- read.table(text="name    city
John    Atlanta
Josh    Atlanta
Matt    Atlanta
Bob     Boston
Kate    Boston
Lily    Boston
Matt    Boston
Bob     Seattle
Kate    Seattle",header=TRUE)

各都市で3番目のアイテムを入手します。

do.call(rbind,by(test,test$city,function(x) x[3,]))

結果:

        name    city
Atlanta Matt Atlanta
Boston  Lily  Boston
Seattle <NA>    <NA>

必要なものを正確に取得するために、ここに小さな関数があります。

nthrow <- function(dset,splitvar,n) {
    result <- do.call(rbind,by(dset,dset[splitvar],function(x) x[n,]))
    result[,splitvar][is.na(result[,splitvar])] <- row.names(result)[is.na(result[,splitvar])]
    row.names(result) <- NULL
    return(result)
}

次のように呼びます:

nthrow(test,"city",3)

結果:

  name    city
1 Matt Atlanta
2 Lily  Boston
3 <NA> Seattle
于 2012-10-12T00:12:12.437 に答える
3

解決data.table

library(data.table)
DT <- data.table(test)

# return all columns from the subset data.table
n <- 4
DT[,.SD[n,] ,by = city]
##      city name
## 1: Atlanta   NA
## 2:  Boston Matt
## 3: Seattle   NA

# if you just want the nth element of `name` 
# (excluding other columns that might be there)
# any of the following would work

DT[,.SD[n,] ,by = city, .SDcols = 'name']


DT[, .SD[n, list(name)], by = city]


DT[, list(name = name[n]), by = city]
于 2012-10-16T04:57:20.943 に答える
2

これに使用できますplyr

dat <- structure(list(name = c("John", "Josh", "Matt", "Bob", "Kate", 

"リリー", "マット"), 都市 = c("アトランタ", "アトランタ", "アトランタ", "ボストン", "ボストン", "ボストン", "ボストン")), .Names = c("名前"、"都市")、クラス = "data.frame"、row.names = c(NA, -7L))

library(plyr)

ddply(dat, .(city), function(x, n) x[n,], n=3)

> ddply(dat, .(city), function(x, n) x[n,], n=3)
  name    city
1 Matt Atlanta
2 Lily  Boston
> ddply(dat, .(city), function(x, n) x[n,], n=4)
  name   city
1 <NA>   <NA>
2 Matt Boston
> 

data.tableベースRまたはまたはsqldf...を使用する他のオプションもたくさんあります

于 2012-10-12T00:08:28.400 に答える