表(subset())R

时间:2017-06-09 20:37:57

标签: r subset

我的气候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的新手。

2 个答案:

答案 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")))