基于第二数据集中的元数据从数据集中提取数据

时间:2012-07-15 00:36:43

标签: r subset

有没有人建议如何根据存储在第二个数据集中的元数据从数据集中提取列?只是想知道是否有一种相对简单的方式(例如使用“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”的那些样本?

2 个答案:

答案 0 :(得分: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()[运算符进行子集化。

答案 1 :(得分:1)

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

(1)我如何从位置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