首先 - 抱歉,我对这一切都是新手,所以我可能会以令人困惑的方式写东西。
我需要读取多个.csv文件,为了节省大量时间,我正在寻找一种自动化的方法。 我希望读取.csv的不同行,并根据最后一列中存储的信息将信息存储为两个单独的文件。
我的数据是特定的区域和 3D 图像的切片,我将使用它来编译卷。如果两行具有相同的"切片",那么我需要将它们分开,因为第 1 行中找到的区域对应于与同一切片上第 2 行中具有区域的区域不同的结构。
例如:
行,面积,切片
1,50,180
2,52,180
3,49,181
4,53,181
5,65,182
6,60,183
因此,切片结构 1 在切片 180(面积 = 50(和 181(面积 = 49(处有一个面积,而结构 2 在每个切片处都有一个从 180 到 183 的面积。 我希望能够将所有粗体数据存储在一个.csv中,将所有其他数据存储在另一个.csv
可能存在.csv或多或少重叠切片值的文件,这增加了复杂性。 感谢您的帮助,如果我需要澄清任何事情,请告诉我。
使用duplicated
:
dat <- read.csv(text="
Row,area,slice
1,50,180
2,52,180
3,49,181
4,53,181
5,65,182
6,60,183")
dat[duplicated(dat$slice),]
# Row area slice
# 2 2 52 180
# 4 4 53 181
dat[!duplicated(dat$slice),]
# Row area slice
# 1 1 50 180
# 3 3 49 181
# 5 5 65 182
# 6 6 60 183
(是将最后两个帧中的每一个写入文件还是存储它们以供以后使用取决于您。
duplicated
通常为字段的第二个和后续事件返回TRUE
。你的逻辑 2,4,5,6 更像是"最后一个骗子"或"没有骗子",这有点不同。
library(dplyr)
dat %>%
group_by(slice) %>%
slice(-n()) %>%
ungroup()
# # A tibble: 2 x 3
# Row area slice
# <int> <int> <int>
# 1 1 50 180
# 2 3 49 181
dat %>%
group_by(slice) %>%
slice(n()) %>%
ungroup()
# # A tibble: 4 x 3
# Row area slice
# <int> <int> <int>
# 1 2 52 180
# 2 4 53 181
# 3 5 65 182
# 4 6 60 183
同样,对于data.table
:
library(data.table)
as.data.table(dat)[, .SD[.N,], by = .(slice)]
# slice Row area
# 1: 180 2 52
# 2: 181 4 53
# 3: 182 5 65
# 4: 183 6 60
as.data.table(dat)[, .SD[-.N,], by = .(slice)]
# slice Row area
# 1: 180 1 50
# 2: 181 3 49