从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