1

必要なのは、関数を実行するのに十分なデータがあるかどうかを確認するために df をチェックする方法です。特定の市場に十分なデータがない場合、「市場」全体を削除する方法を知りたいです。たとえば、AD3 のすべてを削除したいと考えています。これは、4 行必要なときに 2 行のデータしかないためです。私の実際のケースでは、23 行未満のデータを持つ市場を削除しようとしていますが、100 以上の市場があります。

これがdput()私のデータから少し離れたものです。

data<-structure(list(market = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 3L, 3L), .Label = c("AD1", "AD2", "AD3"), class = "factor"), 
date = structure(c(15623, 15624, 15625, 15628, 15623, 15624, 
15625, 15628, 15625, 15628), class = "Date"), open = c(101.52, 
101.68, 102.1, 101.99, 100.73, 100.85, 101.57, 101.01, 100.56, 
100.42), high = c(102.07, 102.39, 102.36, 102.07, 101.4, 
101.59, 101.62, 101.35, 100.56, 100.71), low = c(101.26, 
101.56, 101.63, 101.5, 100.59, 100.85, 101.07, 100.97, 100.56, 
100.41), last = c(101.78, 102.08, 101.76, 101.91, 101.08, 
101.37, 101.06, 101.21, 100.41, 100.56)), .Names = c("market", 
"date", "open", "high", "low", "last"), row.names = c(1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 11L, 12L), class = "data.frame", na.action = structure(9:10,.Names = c("9", 
"10"), class = "omit"))

100 以上の市場が 1 つのデータ フレームに含まれています。したがって、22 行のデータがある場合、その特定の「市場」名に関連付けられている 22 行すべてを削除する必要があります。

4

2 に答える 2

2

@Mariusの方が高速でしたが、それでも私のソリューションはほぼ同じです:

N <- 3 # threshold
range <- names(which(table(data$market)>=N))
ans1 <- data[data$market %in% range,]
ans1

ただし、大規模なデータ セットで 100 以上の市場を分析する場合は、data.table高速化のために以下を使用することをお勧めします。

require(data.table)
dt <- data.table(data)
setkey(dt, market)
ans2 <- dt[J(range)]
ans2

結果は同様です。

all.equal(ans1,ans2,check.attributes=F)
# [1] TRUE
于 2013-02-11T23:48:42.493 に答える
1

各市場の発生をカウントするために使用tableします。そこからは非常に簡単です。

min_data_points <- 4
market_tab <- table(data$market)
markets_to_keep <- names(market_tab)[market_tab >= min_data_points]

fixed_data <- subset(data, market %in% markets_to_keep)
于 2013-02-11T23:33:37.567 に答える