【发布时间】:2016-10-27 09:36:37
【问题描述】:
这是我的第一篇文章,所以请放轻松;D
对于我参与的一些研究,我们为脊髓切片生成了两个面积测量值。较小的尺寸是指受伤形成的空腔,较大的区域是整个脊髓。这些测量是在 Photoshop 中进行的,并以相同的文档名称导出,但值明显不同。 例如,
$`T7-B9_TileScan_005_Merging001_ch00.tif`
Label Document Area
1827 Measurement 39 T7-B9_TileScan_005_Merging001_ch00.tif 92,041.52
1831 Measurement 40 T7-B9_TileScan_005_Merging001_ch00.tif 3,952,865.00
这实际上是我使用 R 的子集函数删除数据创建的简化版本。我必须这样做的原因是疤痕区域的范围与总脐带区域的范围重叠,这意味着它们不能通过简单的尺寸排除来过滤。
我的示例数据集可以在here 找到。 要生成这个,请在此处关注我的 [EDITED] 工作。
Scar.Ablation.Data <- read.csv("/Scar Ablation Data.csv", stringsAsFactors=F)
添加 stringsAsFactors=F 更正了稍后生成的错误。
test1 <- subset(Scar.Ablation.Data, Count != "", select = c(Label,Document,Area))
删除所有没有 Count 值的数据。当 Photoshop 导出数据时,它使用了冗余测量值。然而,所有这些冗余测量都不包含 Count 值,因此可以将它们删除。建议的替代方法不起作用,因为 R 没有读取 Count 列中的任何值作为 NA。
fileList = split(test1,test1$Document)
生成一个列表,其中测量值由文档名称分隔。
spineAreas = lapply(fileList, function(x) x[which(x$Area==max(x$Area)), ])
获取每个列表(表示给定文件名的所有数据),然后查找并返回每个文件面积最大的行中的数据。
scarAreas = lapply(fileList, function(x) x[which(x$Area==min(x$Area)), ])
我们想要每个文件的所有行的数据,其面积小于最大面积。 Lapply 返回一个列表,所以现在我们要将它们转回 dataFrames
spineData = do.call(rbind,spineAreas)
scarData = do.call(rbind,scarAreas)
row.names(spineData)=NULL #clean up row names
row.names(scarData)=NULL
write.csv(scarData, "/scarData.csv")
write.csv(spineData, "/spineData.csv")
比较我的导出时,出现以下问题:
spineData 包含 Null 值,但 ScarData 没有。
通过在scarArea 的函数中将x$Area<max 切换为x$Area==min 解决了这个问题。输出虽然仍然不正确,但并没有因此修改而改变。
- 区域之间的比较并不总是有效。例如,对于样本“C1-B3_TileScan_002_Merging001_ch00.tif”,疤痕报告的面积高于脐带。
我尝试使用aggregate() 函数尝试不同的比较方法,但这返回的数据与使用上述方法生成的数据完全相同。然而,R 正在计算这些比较,它认为它正在做出正确的决定。这可能表明我的区域数值存在某种格式或导入问题。
spineAreas2 = aggregate(Area ~ Document, data = test1, max)
scarAreas2 = aggregate(Area ~ Document, data = test1, min)
spineData2 = do.call(rbind,spineAreas2)
scarData2 = do.call(rbind,scarAreas2)
row.names(spineData2)=NULL #clean up row names
row.names(scarData2)=NULL #clean up row names
do.call(rbind, lapply(spineAreas, data.frame, stringsAsFactors=FALSE))
do.call(rbind, lapply(scarAreas, data.frame, stringsAsFactors=FALSE))
#Then clean up row names as in first example, or pass row.names=F
#when writing to a .csv file
write.csv(scarData2, "C/scarData2.csv")
write.csv(spineData2, "CspineData2.csv")
我可以将 Null 替换为 0 或 NA,我可能会尝试这样做以解决此问题。感谢@Cole 继续帮助解决这个问题,非常感谢。
【问题讨论】: