首页 > 解决方案 > 如何一次在多个 csv 文件中逐行查找(并输出)第一个值 1 和最后一个值 1 的位置?

问题描述

我试图在一次存储在多个 csv 文件中的多个二进制矩阵中逐行输出第一个值 1 和最后一个值 1 的位置?

我有以下用于读取工作目录中所有制表符分隔的 csv 文件...

csvs <- list.files(pattern="*.csv")
files <- lapply(csvs, read.delim)

首先,我试过...

first_1 <- sapply(files, function(x) min(which(x == 1)))

但这并没有给我正确的答案。例如,在具有二进制矩阵的 csv 文件中

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   1   1   1   1   1   1   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   1   1   1   0   0   1   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   1   0   1   1   0   0   0   0   0   0

0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   1   1   1   1   0   0   0   0   0

0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0

0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0

0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0

0   0   0   0   0   0   0   1   0   0   0   1   1   1   1   0   0   0   1   0   0   0   0   0   0

0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   1   0   1   1   0   0   0   0   0   0

0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   1   1   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   1   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

sapply 在应该输出 135 时输出 152。有人可以帮忙吗?

50 x 50 数据框

标签: rcsvdataframebinary-matrix

解决方案


您正在读取数据并创建数据框而不是矩阵。这可能会影响您的结果,但不会在这里,因为数据帧和矩阵都由 R 列处理,因此您得到的问题的正确答案不是您想要的。最简单的方法是使用t(). 我从您的示例中创建了一个数据框,名为dta

min(which(dta == 1))
# [1] 159
min(which(t(dta) == 1))
# [1] 135

较大的矩阵工作得很好(回复下面的评论)。首先创建一个可重现的矩阵。

dta <- matrix(0, 50, 50)
ones <- structure(c(25L, 22L, 27L, 9L, 31L, 38L, 32L, 2L, 9L, 50L, 7L, 
19L, 40L, 47L, 26L, 1L, 47L, 34L, 16L, 23L, 39L, 3L, 30L, 50L, 
11L, 3L, 41L, 28L, 22L, 15L, 50L, 31L, 28L, 38L, 16L, 25L, 14L, 
22L, 12L, 11L, 40L, 44L, 1L, 38L, 7L, 39L, 1L, 39L, 33L, 50L, 
16L, 15L, 4L, 37L, 25L, 25L, 18L, 9L, 21L, 32L, 47L, 49L, 17L, 
48L, 26L, 7L, 4L, 47L, 16L, 11L, 35L, 17L, 25L, 23L, 24L, 4L, 
12L, 23L, 8L, 38L, 19L, 32L, 8L, 35L, 1L, 48L, 42L, 45L, 43L, 
45L, 30L, 41L, 5L, 5L, 49L, 37L, 19L, 20L, 48L, 43L), .Dim = c(50L, 
2L), .Dimnames = list(NULL, c("row", "col")))
dta[ones] <- 1
dim(dta)  # Show the number of rows and columns
# [1] 50 50

View(dta)您可以在使用以下代码之前浏览矩阵:

min(which(dta == 1))  # By columns
# [1] 16
min(which(t(dta) == 1))  # By rows
# [1] 5

推荐阅读