2017-06-09 21 views
0

我有一個氣候DF看起來像......表(子集())錯誤中的R

ID  NAME DATE TYPE VALUE 
13943 HARLI 1207 TMIN 50.00 
13943 HARLI 1208 TMAX 68.71 
13943 HARLI 1015 PRCP 0.02 
13258 DFW 1207 TMIN 50.00 
13258 DFW 921 TMAX 80.21 
13258 DFW 801 TMIN 50.00 
13555 WACO 131 PRCP 0 

我想確保每個站名(ID)有一定數量的每個記錄DF。例如,我希望DFW在DF中至少有6900條記錄,否則我不希望這些記錄在新的DF中。

當我的類型在VALUE列中只有TMAX和TMIN時,下面的代碼看起來工作正常,但是,我添加了更多數據。

CombinedFifteenYearsTemp <- CombinedFifteenYears[CombinedFifteenYears$ID 
           %in% names(which(table(CombinedFifteenYears$ID) >= 6900)),] 

我已經包括了PRCP(和風力數據),但我不希望> =將這些值考慮在內。我仍然只想要具有TMAX和TMIN值的TYPES數據點> = 6900的站。所以,我想我可以子集名稱中的數據(這(表()))功能,像這樣...

CombinedFifteenYearsTemp <- CombinedFifteenYears[CombinedFifteenYears$ID 
           %in% names(which(table(subset(CombinedFifteenYears, 
           grepl(("TMAX|TMIN"), CombinedFifteenYears$TYPE))) >= 6900)),] 

不過,我得到一個錯誤,指出,

Error in table(subset(CombinedFifteenYears, grepl(("TMAX|TMIN"), 
CombinedFifteenYears$TYPE))) : attempt to make a table with >= 2^31 elements 

有可以計數的除table()以外的函數?僅供參考,我對R很新。

回答

0

試試這個,我將6900更改爲適合您的示例的東西。我製作了「WIND」類型,但是您可以添加您喜歡的任何內容來排除行數。

df <- read.table(text="ID  NAME DATE TYPE VALUE 
13943 HARLI 1207 TMIN 50.00 
       13943 HARLI 1208 TMAX 68.71 
       13943 HARLI 1015 PRCP 0.02 
       13258 DFW 1207 TMIN 50.00 
       13258 DFW 921 TMAX 80.21 
       13258 DFW 801 TMIN 50.00 
       13555 WACO 131 PRCP 0", header=T) 

toKeep <- table(df$NAME[!df$TYPE %in% c("PRCP", "WIND")]) > 2 

df2 <- df[ df$NAME %in% names(toKeep)[toKeep], ] 
+0

謝謝您!正是我想要的。我想這個n00blet需要更多地瞭解table()函數。 – Zacharyj7

0

我試圖重新創建數據:

df <- structure(list(ID = c(13943L, 13943L, 13943L, 13258L, 13258L, 
13258L, 13555L), NAME = c("HARLI", "HARLI", "HARLI", "DFW", "DFW", 
"DFW", "WACO"), DATE = c(1207L, 1208L, 1015L, 1207L, 921L, 801L, 
131L), TYPE = c("TMIN", "TMAX", "PRCP", "TMIN", "TMAX", "TMIN", 
"PRCP"), VALUE = c(50, 68.71, 0.02, 50, 80.21, 50, 0)), .Names = c("ID", 
"NAME", "DATE", "TYPE", "VALUE"), class = "data.frame", row.names = c(NA, 
-7L)) 

這可能是完成你想要的方式,你可以國防部根據您的標準:

require(dplyr) 
df %>% group_by(NAME) %>% 
     mutate(n = n()) %>% 
     filter(n>= 6700 & TYPE %in% c("TMIN", "TMAX") | !(TYPE %in% c("TMIN", "TMAX"))) 
+0

感謝您的輸入!我需要在沒有dplyr的情況下執行此操作,但我確定其他人會覺得這很有用。 – Zacharyj7