2

有没有人建议如何根据存储在第二个数据集中的元数据从数据集中提取列?只是想知道是否有一种相对简单的方法(例如使用“colnames”或“subset”)。我的原始数据集非常大,有 100 多列和 30,000 多行。打开文件并在 Excel 中选择是一种痛苦。

这里有两个示例数据集:

set1 <- data.frame(ID = rnorm(5, 5000, 1000), Sample1 = rnorm(5, 50000, 2500), 
Sample2 = rnorm(5, 50000, 2500), Sample3 = rnorm(5, 50000, 2500), 
Sample4 = rnorm(5, 50000, 2500), Sample5 = rnorm(5, 50000, 2500))

meta.data <- data.frame(Sample_name = c("Sample1", "Sample2", "Sample3", 
"Sample4", "Sample5"), Location = c("Loc1", "Loc2", "Loc3", "Loc1", "Loc1"), 
Time = c("M0", "M01", "M02", "M02", "M03"), 
Conc = c("lo", "hi", "lo", "lo", "lo"))

(1) 我怎样才能提取(作为一个新的数据集)位置 Loc1 的所有样本或时间 M02 的所有样本?

(2) 如何提取具有特定 ID 号的行并仅选择该行中具有 Conc“lo”的样本?

4

2 回答 2

2

这是一种方法,涉及转换set1为长数据格式,然后将其加入meta.data

library(reshape2)
set1.m <- melt(set1)
merge(set1.m, meta.data, by.x = "variable", by.y = "Sample_name", all = TRUE)
#-----
   variable     value Location Time Conc
1        ID  4168.153     <NA> <NA> <NA>
2        ID  5402.048     <NA> <NA> <NA>
..
..
29  Sample5 49668.695     Loc1  M03   lo
30  Sample5 52869.040     Loc1  M03   lo

我不确定 ID 列是否应该被熔化。如果没有,您可以简单地将melt呼叫更改为set1.m <- melt(set1, id.vars = "ID")

无论如何,这种格式的数据现在可以直接使用subset()[运算符进行子集化。

于 2012-07-15T00:55:55.903 回答
1

不确定这是否是最好的方法,合并可能更合适,但这里是如何做一些子集:

(1) 我如何从 Location Loc1 中提取(作为新数据集)所有样本......

#get a list of the samples all from Location Loc1
as.character(meta.data$Sample_name[meta.data$Location=="Loc1"])
#use this list of samples to subset the set1 data
set1[c("ID",as.character(meta.data$Sample_name[meta.data$Location=="Loc1"]))]

        ID  Sample1  Sample4  Sample5
1 3836.499 53304.29 47720.79 49504.96
2 4620.443 49406.93 49123.49 50419.93
3 5614.903 44413.93 50387.27 48652.29
4 6676.880 52732.63 48282.92 53544.17
5 3926.077 52593.59 50204.96 49563.13

(2) 如何提取具有特定 ID 号的行并仅选择该行中具有 Conc“lo”的样本?

由于示例是随机数,我刚刚用作此处set1$ID[1]选择的替代品。ID只需用类似的东西替换它set1$ID=="idnum1"

subset(set1,set1$ID==set1$ID[1])[c("ID",as.character(meta.data$Sample_name[meta.data$Conc=="lo"]))]

        ID  Sample1  Sample3  Sample4  Sample5
1 3836.499 53304.29 49706.58 47720.79 49504.96
于 2012-07-15T01:50:45.310 回答