我的气候df看起来像......
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
我正在尝试确保每个电台的NAME(ID)每个df都有一定数量的记录。例如,我希望DFW在df中至少有6900条记录,否则我不想在新的df中记录这些记录。
当我的类型在VALUE列中只有TMAX和TMIN时,下面的代码似乎工作正常,但是,我已经添加了更多的数据。
CombinedFifteenYearsTemp <- CombinedFifteenYears[CombinedFifteenYears$ID
%in% names(which(table(CombinedFifteenYears$ID) >= 6900)),]
我已经包含PRCP(和风数据),但我不希望&gt; =考虑这些值。对于具有TMAX和TMIN值的TYPES,我仍然只想要具有&gt; = 6900个数据点的站。所以我认为我可以在名称(which(table()))函数中对数据进行子集化,就像这样......
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 :(得分: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], ]
答案 1 :(得分: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")))