1

これには非常に簡単な答えがあると思います。しかし、ここに行きます。

長い形式のデータ。このような

d <- data.frame(cbind(numbers = rnorm(10), 
                         year = rep(c(2008, 2009), 5), 
                         name = c("john", "David", "Tom", "Kristin", "Lisa","Eve","David","Tom","Kristin","Lisa")))

2008年と2009年の両方で発生する名前の行のみを含む新しいデータフレームを取得するにはどうすればよいですか?(つまり、David、Kristin、Lisa、Tomのみ)。

前もって感謝します

4

4 に答える 4

11

簡単な方法:

subset(
    d,
    name %in% intersect(name[year==2008], name[year==2009])
)
于 2009-09-06T17:43:09.400 に答える
3

1つのアプローチは、reshapeパッケージを使用して、列に年、行に名前を持つdata.frameを作成することです。

library(reshape)
cast(d, name ~ year, value = "numbers")

complete.cases次に、を使用して対象の行を抽出できます。

于 2009-09-06T15:28:50.357 に答える
2

1年に1つのレコードしかない場合は、各人がデータセットに表示される回数を数えます。

counts <- as.data.frame(table(name = d$name))

次に、2回登場したすべての人を探します。

subset(counts, Freq == 2)
于 2009-09-06T15:31:17.013 に答える
1

これは、ベースRのみを使用し、人が1年に持つレコードの数について何も仮定しない別のソリューションです。

d <- data.frame(cbind(numbers = rnorm(10), 
                      year = rep(c(2008, 2009), 5),
                      name = c("john", "David", "Tom", "Kristin",
                               "Lisa","Eve","David","Tom","Kristin",
                               "Lisa")))
# split data into 2 data.frames (1 for each year)
by.year <- split(d, d$year, drop=T)

# find the names that appear in both years
keep <- intersect(by.year[['2008']]$name, by.year[['2009']]$name)
# Or, if you had several years, use Reduce as a more general solution:
keep <- Reduce(intersect, lapply(by.year, '[[', 'name'))

# show the rows of the original dataset only if their $name field
# is in our 'keep' vector
d[d$name %in% keep,]
于 2009-09-06T16:26:30.150 に答える