r - 如何一次在多个 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。有人可以帮忙吗?
解决方案
您正在读取数据并创建数据框而不是矩阵。这可能会影响您的结果,但不会在这里,因为数据帧和矩阵都由 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
推荐阅读
- java - 保存 Java GUI 的状态
- sql - 在 SQL 中使用 Intersect 和子查询时无法获得输出
- node.js - 获取 google.sqladmin 不是函数错误
- javascript - Firebase OTP 身份验证:令牌验证 API
- python - 在pytorch中用概率进行回归的最先进方法是什么
- android - 使用 Intent.ACTION_PICK 启动活动时,我的 Android 应用程序未显示
- python - R 中全局 (??) 帮助部分的 Python 等效项
- algorithm - 使用分而治之的 JPEG 图像的大多数元素
- assembly - Windows 服务是程序集 - StartServiceCtrlDispatcher 错误 3221225477
- java - 显示 .txt 文件中的数据