从R中的各个单元格提取摘要数据

从R中的各个单元格提取摘要数据,r,R,以下是数据: data <-data.frame( "start"= c("go",NA,NA,NA,"go",NA,"go"), "number"= c(31,32,1,29,61,17,72), "info"= c("c","k","s","u","b","i","n")) start number info 1 go 31 c 2 <NA> 32 k 3 <NA> 1 s 4

以下是数据:

data <-data.frame(
    "start"= c("go",NA,NA,NA,"go",NA,"go"),
    "number"= c(31,32,1,29,61,17,72),
    "info"= c("c","k","s","u","b","i","n"))

   start number info
1    go     31    c
2  <NA>     32    k
3  <NA>      1    s
4  <NA>     29    u
5    go     61    b
6  <NA>     17    i
7    go     72    n
data您可以使用dplyr:

data <-data.frame(
  start= c("go",NA,NA,NA,"go",NA,"go"),
  number= c(31,32,1,29,61,17,72),
  info= c("c","k","s","u","b","i","n"),stringsAsFactors = F)

library(dplyr)
data$group = cumsum(!is.na(data$start))
data %>% group_by(group) %>% summarize(n=sum(number), info=info[1])
您可以选择添加

 %>% mutate(start="go") %>% select(-group)
以获得您请求的输出,但我不确定这是否真的增加了价值。
希望这有帮助

base R中的策略是在单独的操作中执行子集设置和求和,然后将结果合并在一起。在这里,我们可以使用
cbind
进行合并,因为这两个数据集是为了对齐而构建的

cbind(data[!is.na(data$start), c(1, 3)],
      sum=aggregate(number ~ cumsum(!is.na(start)), data=data, sum)[,2])
  start info sum
1    go    c  93
5    go    b  78
7    go    n  72

我使用
!is.na
选择合适的行,在本例中有效。如果要排除其他非NA值,可以使用
!is.na(data$start)&data$start==“go”
aggregate
用于执行求和,第二个参数中的分组使用相同的方法,但对结果执行累积求和。

这里有一个使用
数据的选项。table

library(data.table)
setDT(data)[, .(start = start[!is.na(start)], n = sum(number), 
     info = info[1]), .(grp = cumsum(!is.na(start)))][, grp := NULL][]
#   start  n info
#1:    go 93    c
#2:    go 78    b
#3:    go 72    n

对于您的数据,不要使用
cbind
data.frame(“start”=…)
足够了,
cbind
将生成一个字符矩阵,以便将数字变量转换为字符,然后再转换为因子。
cbind(data[!is.na(data$start), c(1, 3)],
      sum=aggregate(number ~ cumsum(!is.na(start)), data=data, sum)[,2])
  start info sum
1    go    c  93
5    go    b  78
7    go    n  72
library(data.table)
setDT(data)[, .(start = start[!is.na(start)], n = sum(number), 
     info = info[1]), .(grp = cumsum(!is.na(start)))][, grp := NULL][]
#   start  n info
#1:    go 93    c
#2:    go 78    b
#3:    go 72    n