按R中的字符串指定的选定列对行求和

按R中的字符串指定的选定列对行求和,r,data-management,rowsum,R,Data Management,Rowsum,我拥有的:一个包含1451行和4663列的大文件,值为0、1和NAs。行名称表示场地,列名称表示调查日期。我希望使用特定的日期间隔对行进行求和,也就是对引用列名称(表示日期)的特定列进行求和。在本例中,我有666个不同的日期间隔来求和行。特定间隔在对象类型字符中 一个简短的可复制示例是: df <- read.table(text =" 2005-09-23 2005-09-24 2005-09-25 2005-09-26 2005-09-27 2005-09

我拥有的:一个包含1451行和4663列的大文件,值为0、1和NAs。行名称表示场地,列名称表示调查日期。我希望使用特定的日期间隔对行进行求和,也就是对引用列名称(表示日期)的特定列进行求和。在本例中,我有666个不同的日期间隔来求和行。特定间隔在对象类型字符中

一个简短的可复制示例是:

    df <- read.table(text ="     2005-09-23  2005-09-24  2005-09-25  2005-09-26    2005-09-27  2005-09-28  2005-09-29  2005-09-30  2005-10-07  2005-10-08
1  0       0     1    NA    1       0     1    NA   1   0          
2  1       1     1    1     1       1     1    1    1   1    
3  NA      NA    NA   NA    NA      NA    NA   NA   NA  NA", header = TRUE)

df我们将“df”的列名转换为
Date
类,然后将
\uu
处的“interval”向量拆分为一个
向量列表
,使用“v1”的比较运算符创建一个逻辑向量,在此基础上对“df”的列进行子集划分,最后得到
行和
cbind
列出
元素

v1 <-  as.Date(names(df), "X%Y.%m.%d")
out <- do.call(cbind.data.frame, lapply(strsplit(intervals, "_"), function(x){
     tmp <- df[v1 >= x[1] & v1 <= x[2]]
     NA^(!rowSums(!is.na(tmp)))* rowSums(tmp, na.rm = TRUE)
  }))
colnames(out) <- intervals
out
#  2005-09-23_2005-09-26 2005-09-27_2005-10-30 2005-10-07_2005-10-08
#1                     1                     3                     1
#2                     4                     6                     2
#3                    NA                    NA                    NA

v1对于第二列,我得到3,6,NA作为输出。你能检查一下你的“结果”中是否有拼写错误吗。我的结果的第二栏没有任何打字错误。其余的列都很好,我不知道为什么第二列不匹配。需要注意的是:第二列的日期周期总和并不代表该时间段内的所有连续天数(即时间段为9月27日至10月30日,但该时间段内只有3天的数据)。这可能是此时间段总和的错误结果的问题吗?
result <- read.table(text ="     2005-09-23_2005-09-26  2005-09-27_2005-10-30  2005-10-07_2005-10-08
1  1       2     1           
2  4       4     2     
3  NA      NA    NA", header = TRUE)
v1 <-  as.Date(names(df), "X%Y.%m.%d")
out <- do.call(cbind.data.frame, lapply(strsplit(intervals, "_"), function(x){
     tmp <- df[v1 >= x[1] & v1 <= x[2]]
     NA^(!rowSums(!is.na(tmp)))* rowSums(tmp, na.rm = TRUE)
  }))
colnames(out) <- intervals
out
#  2005-09-23_2005-09-26 2005-09-27_2005-10-30 2005-10-07_2005-10-08
#1                     1                     3                     1
#2                     4                     6                     2
#3                    NA                    NA                    NA