【问题标题】:table(subset()) Error in RR中的表(子集())错误
【发布时间】:2017-06-09 20:37:57
【问题描述】:

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

我正在尝试确保每个站名 (ID) 的每个 df 都有一定数量的记录。例如,我希望 DFW 在 df 中至少有 6900 条记录,否则我不希望新 df 中有这些记录。

当我的类型在 VALUE 列中只有 TMAX 和 TMIN 时,下面的代码似乎可以正常工作,但是,我已经添加了更多数据。

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

我已经包含了 PRCP(和风数据),但我不希望 >= 考虑这些值。对于具有 TMAX 和 TMIN 值的类型,我仍然只需要 >=6900 个数据点的站。所以我想我可以在 names(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 很陌生。

【问题讨论】:

    标签: r subset


    【解决方案1】:

    试试这个,我将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], ]
    

    【讨论】:

    • 谢谢!正是我想要的。我猜这个 n00blet 需要进一步了解 table() 函数。
    【解决方案2】:

    我已尝试重新创建您的数据:

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

    【讨论】:

    • 感谢您的意见!我需要在没有 dplyr 的情况下执行此操作,但我相信其他人会发现这很有用。
    猜你喜欢
    • 1970-01-01
    • 2014-12-07
    • 2021-08-29
    • 1970-01-01
    • 2018-05-30
    • 2018-07-28
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多