1

我是使用 R 的新手,我有一个问题正在尝试寻找答案。我有一个组织如下的文件(它有数千行,但为了简单起见,我只显示一个示例):

YEAR   Month  day    S1      T1     T2         R1
1965    3       2    11.7    20.6    11.1    18.8
1965    3       3    14.0    16.7     3.3     0.0
1965    3       4   -99.9   -99.9   -99.9   -99.9
1965    3       5     9.2     5.6     0.0   -99.9
1965    3       6    10.1     6.7     0.0   -99.9
1965    3       7     9.7     7.2     1.1     0.0

我想知道 -99.9 所在的年、月和日的每一列(T1、T2 和 R1);例如,从 1980/1/3 到 1980/1/27,T1 有 X -99.9,从 1990/2/10 到 1990/3/30,T1 有 Y-99.9 ......等等。T2 和 R 也是如此。如何在 R 中做到这一点?

这只是一个这样的文件,但我有近 2000 个文件有同样的问题(我知道我需要循环它)但如果我知道如何为一个文件执行它,那么我将创建一个循环。

我真的很感激任何帮助。非常感谢您的阅读和帮助!!!

4

2 回答 2

0

如果我理解正确,您想按列获得每月获得多少个“-99.9”,

这是我的 S1 代码,使用plyr. 您会注意到,我扩展了您的示例以获得多一个月的数据。

library(plyr)

my.table <-read.table(text="YEAR Month day S1 T1 T2 R1
1965 3 2 11.7 20.6 11.1 18.8
1965 3 3 14.0 16.7 3.3 0.0
1965 3 4 -99.9 -99.9 -99.9 -99.9
1965 3 5 9.2 5.6 0.0 -99.9
1965 3 6 10.1 6.7 0.0 -99.9
1965 3 7 9.7 7.2 1.1 0.0
1966 1 7 -99.9 7.2 1.1 0.0
1966 1 8 -99.9 7.2 1.1 0.0
", header=TRUE, as.is=TRUE,sep = " ")

#Create a year/month column to summarise per month
my.table$yearmonth <-paste(my.table$YEAR,"/",my.table$Month,sep="")

S1 <-count(my.table[my.table$S1==-99.9,],"yearmonth")
S1
  yearmonth freq
1    1965/3    1
2    1966/1    2
于 2012-04-25T01:30:27.560 回答
0

我冒昧地将您的最后一个数据框列重命名为“R1”

 lapply(c('T1', 'T2', 'R1'), function(x) { dfrm[ dfrm[[x]]==-99.9 , # rows to select
                                               1:3 ] }# columns to return
        )
#-------------    
[[1]]
  YEAR Month day
3 1965     3   4

[[2]]
  YEAR Month day
3 1965     3   4

[[3]]
  YEAR Month day
3 1965     3   4
4 1965     3   5
5 1965     3   6

目前尚不清楚您是否想要值或计数(我认为您不能在同一个报告中同时拥有两者。)如果您想命名条目:

> misdates <- .Last.value
> names(misdates) <- c('T1', 'T2', 'R1')

如果你想要一个计数:

 lapply(misdates, NROW)
$T1
[1] 1

$T2
[1] 1

$R1
[1] 3

(您可能想了解如何使用 NA 值。不建议使用数字作为缺失值进行数据管理。)

于 2012-04-24T21:16:28.490 回答