R添加小计直到下一个空白

时间:2015-04-04 09:01:50

标签: r

我在csv文件中有这样的数据:

Id A B
1  1 
2  1 1
3    1
4  1 1
5  1 
6  1 1
7    1

我想把所有的Ones加起来,直到下一个空白出现。不是所有的总和。只有“小计”直到下一个空白。因此,在上面的示例中,这将导致:

A B
2 3
3 2

我在Excel中尝试过但无法找到解决方案。 谢谢。

更新:

这是你给我的代码和(有点)工作的代码:

dat <- read.table("my.csv", sep=",", header=TRUE, text= "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53")
x <-sapply(dat[, -1], function(x) na.omit(with(rle(x), lengths * values)))

这是head(x)的输出:

$X1
  [1]  2  3  8  2  5 13  4 25  2 24  5  9  8  2 20 24  5  3  1 16 10 15  2 15  3 15  1
 [28] 10  3  1 12  4 11  6  3  1 23 24  5  6  5  1  1  7 12  3  8  4  7  2  6  4  4  1
 [55]  1  1 24  5  3  2  4  9  3  5 22  1  3 10  6  1 14  3  6  6  8  3 13  2  7  3  2
 [82] 16 16  2  3  2 12  2  9 23  3  9  7  8  2  6  3 23 10  4 13  3  2  5  1  1  7 10
[109]  8  5  4  3  4  5  5  1  4 10  1 16 39  9  1  1  9  3  2 13  5  9  7  9  6  1  3
[136]  1  4 44 21  2 12  1 59  4  2  7  1  8  3 12 10 10  8 18  5  1  1 13 11  2  1 18
[163] 12 11  5  1  2  8  8  7  5  6  2  5 19  2 21  3  1 18  1  2  9 12 11  3  8  2  5
[190] 11  2  5 20  4 16  7 11  2 14 14 15  2  2  6 12  5 13  3  4  2  2  3  8 11 11 14
[217]  2  4  2  3  9  5  6  6  4 10  5  2  9 18 17  5  4  3  6  9 23  3 12  3  5  1 19
[244]  4  4 13 26  3  9 17  3  3  1  1  4 17 14  8  2  7  6  5 37  6  1  5  9 13  1  5
[271]  2 22
attr(,"na.action")
  [1]   1   3   5   7   9  11  13  15  17  18  20  22  24  26  28  30  32  34  36  38
 [21]  40  42  44  46  48  50  52  53  55  57  59  61  63  65  67  69  71  73  74  76
 [41]  78  80  82  83  85  87  89  91  93  95  97  99 101 103 105 107 108 110 112 113
 [61] 115 117 119 121 123 125 127 129 130 132 134 136 138 140 142 144 145 147 149 151
 [81] 152 154 156 158 160 162 164 166 168 170 172 174 176 178 180 182 184 186 188 190
[101] 192 194 196 198 200 202 203 205 207 209 211 213 215 217 219 221 223 225 227 229
[121] 230 232 234 236 238 240 242 244 246 248 250 252 254 256 258 260 261 263 265 267
[141] 269 271 273 274 275 277 279 281 283 284 286 288 290 292 293 295 297 299 301 303
[161] 305 307 309 311 313 315 317 319 321 323 325 327 329 331 333 334 336 338 340 342
[181] 344 346 348 349 351 353 355 357 359 361 363 365 367 368 370 372 374 376 378 380
[201] 382 384 386 388 390 392 394 396 398 400 402 403 405 407 409 411 412 414 416 418
[221] 420 422 424 426 428 430 431 433 434 436 438 440 442 444 446 448 450 452 454 456
[241] 458 459 461 463 465 467 469 471 473 475 477 479 481 483 485 487 489 491 493 495
[261] 497 499 501 503 505 507 509 511 512 514 516 518 520 522 524 526 527 529 531 532
[281] 534 536 537 539 541 543 545 547 549 551 553 555 556 558 560 562 564 566 568 570
[301] 572 574
attr(,"class")
[1] "omit"

2 个答案:

答案 0 :(得分:1)

你可以尝试这个(我填写了一些NAs)

dat <- read.table(header = TRUE, text="Id A B
1  1 NA
2  1 1
3  NA  1
4  1 1
5  1 NA
6  1 1
7  NA  1")

sapply(dat[, -1], function(x) na.omit(with(rle(x), lengths * values)))
#      A B
# [1,] 2 3
# [2,] 3 2

修改

 d <- as.data.frame(sapply(dat[, -1], function(x) na.omit(with(rle(x), lengths * values))))

str(d)
plot(d)

答案 1 :(得分:0)

使用na.strings=""读取csv文件以获取空字段所在的NA值,并使用计算运行的runs定义函数rle。最后sapply runs覆盖所需的列,将covnert覆盖到data.frame:

Lines <- '"Id","A","B"
"1",1,
"2",1,1
"3",,1
"4",1,1
"5",1,
"6",1,1
"7",,1'

DF <- read.csv(text = Lines, na.strings = "")

runs <- function(x) with(rle(x), lengths[!is.na(values)])
as.data.frame(sapply(DF[-1], runs))

,并提供:

  A B
1 2 3
2 3 2