我在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"
答案 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