2012-07-15 64 views
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”的那些样本?

回答

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号的行,该行中有浓“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 
+0

太棒了!谢谢!还没有尝试用真实的数据集,但我可以复制你的方法与另一个虚拟数据集。但是,set1 $ ID ==“idnum1”不起作用(将IDnum1替换为出现ID列的数字时)。 set1 $ ID [X] works(X is a row number) – Dalmuti71 2012-07-15 02:41:14

+0

请注意,示例data.frame中的数据具有浮点数,因此在R中显示为“3836.499”的ID实际上是“3836.49897995278”。如果您的真实ID是文本或没有小数的数字,代码应该可以正常工作。 – thelatemail 2012-07-15 02:43:52

+0

@thelatemail:这些是小数已知的R陷阱,类似地,秒精度,:*'options('digits'= n)'* *'options('digits.secs'= n)'*; [这些常见问题都经常出现](http://stackoverflow.com/questions/11494188/zoo-objects-and-millisecond-timestamps)。 – smci 2012-07-15 20:38:44

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()[运算符直接进行子集化。

+0

替换它谢谢!这也是一个有趣的方法。不知道它将如何使用原始数据集b/c融化的数据集会很长(150个样本x 55,000行)。但如果它的工作,我想我可以使用“投”重新排列和选择数据点(如果我知道如何使用“投”) – Dalmuti71 2012-07-15 02:52:01