2014-04-16 42 views
1

对不起,我无法制作更具体的标题。我试图让自己摆脱电子表格的困难任务,这给我带来了特别的麻烦 - 我可以在Excel中做到这一点,但我真的不知道如何从R开始。这有点难以描述。我想这里可能涉及到一些技巧,所以我希望这对其他人有用。R中的数据传送:子集和排列不均匀长度的向量

我有来自以下形式从电子表格数据:

数据

1 GOEK, WOWP, PEOL, WJRN, KENC, QPOE, JFPG, PWKR, PWEOR, JFOKE, POQK, LSPF, PEKF,PFOW, VCNS, ALAO, LFOD 
2 KFDL, LFOD, WOWP, PWEO, PWEOR, PRCP, ALPQ, JFOKE, ALLF, VCNS CNIR, 
3 KJTJ, FKOF, VCNS, FLEP 
4 FKKF, EPTR 
5 QPOE, PEOL, WJRN, VCNS, PEKF, PFPW 

而这个数据与下列键关联:

重点

Items A B C 
ALAO NA 0.12246503 0.137902549 
ALLF 0.016262491 0.557522799 0.622560763 
ALPQ 0.409770566 0.770904525 NA 
CNIR NA 0.38075281 0.698236443 
EPTR 0.718354484 0.290028597 0.525661861 
FKKF 0.801489091 0.878405308 0.645004844 
FKOF 0.643251028 0.131643544 NA 
FLEP 0.018262707 0.211220859 0.457302727 
GOEK 0.902121539 NA NA 
JFOKE 0.808410498 0.301443669 0.575188395 
JFPG NA NA 0.343824191 
KENC 0.882285296 0.372821865 0.593742731 
KFDL 0.077569421 0.076497291 NA 
KJTJ 0.249613609  0.227241864 NA 
LFOD NA 0.000343115 0.329546051 
LSPF 0.088451014 0.65148309 0.267490643 
PEKF 0.645309773 NA 0.116601451 
PEOL 0.626916187 0.093812247 0.152577881 
PFOW 0.86690534 0.596673645 NA 
PFPW NA 0.018869604 NA 
POQK 0.683221579 NA 0.472456955 
PRCP 0.486488748 0.860947689 0.097916066 
PWEO 0.665854791 0.814111848 0.026085774 
PWEOR 0.611034332 0.17254104 0.212386401 
PWKR NA NA 0.357298987 
QPOE 0.815885005 0.083834541 NA 
VCNS 0.394817612 0.250760686 0.419539549 
WJRN 0.403002388 0.705142265 0.768961818 
WOWP 0.794250738 NA 0.967405211 

下面是一般方法:

数据来自电子表格中的一个细胞,从而它会由R如果直接导入被解释为一个串中所示的每个行。将每行的字符串拆分为可作为向量存储在R中的表单。

根据与其关联的行中的值将数据过滤为三个类别(A,B或C)。例如,对于第数据的第5行,我们具有值:QPOE, PEOL, WJRN, VCNS, PEKF, PFPW。纵观关键,我们可以把它变成基于什么是包含在A,B或C.这种三子类别是根据是否存在NA该行或不:

A QPOE PEOL WJRN VCNS PEKF B QPOE PEOL WJRN VCNS PFPW C PEOL WJRN VCNS PEKF

现在我们已经瓜分了5行我们数据到其各自的类别,我们可以做一个单独的表此行包含关联值:

A 0.815885005 0.626916187 0.403002388 0.394817612 0.645309773 B 0.083834541 0.093812247 0.705142265 0.250760686 0.018869604 C 0.152577881 0.768961818 0.419539549 0.116601451

所以我们^ h ave一种散列表...排序。现在我想将这些值存储在一个表中。这将从根本看在最终的形式是这样的(显示数据只有5行):

Cat A Item A Value B Item B Value C Item C Value 
5 QPOE 0.815885005 QPOE 0.083834541 PEOL 0.152577881 
5 PEOL 0.626916187 PEOL 0.093812247 WJRN 0.768961818 
5 WJRN 0.403002388 WJRN 0.705142265 VCNS 0.419539549 
5 VCNS 0.394817612 VCNS 0.250760686 PEKF 0.116601451 
5 PEKF 0.645309773 PFPW 0.018869604 NA NA 

在现实中,我在数据 400行“猫”的不只是5

这是存储数据以便于参考的最佳方法吗?嵌套列表会是这样吗?

  1. 猫行1个
    • 甲物品
    • 乙物品
    • Ç物品
  2. 猫行2 ...

我只是犹豫,使数据帧该数据,因为在该行的长度那么多变性我原始数据分为A,B,和C的最短的就必须有NA的填补最长者的长度,以适应在所述数据帧。有关此事的事情让我感到不舒服。

我可以随时查找回答使用的功能和计算出来,所以进行了深入的解释是没有必要,除非你感到特别慷慨!感谢您的时间。

回答

1

我认为这就是我会做,虽然它返回一个稍微不同的形式答案比你自找的 - 我的做法是避免破烂阵列(具有不同的柱长的)。

开始与您的数据:

d <- c("GOEK, WOWP, PEOL, WJRN, KENC, QPOE, JFPG, PWKR, PWEOR, JFOKE, POQK, LSPF, PEKF,PFOW, VCNS, ALAO, LFOD", 
"KFDL, LFOD, WOWP, PWEO, PWEOR, PRCP, ALPQ, JFOKE, ALLF, VCNS CNIR", 
"KJTJ, FKOF, VCNS, FLEP", "FKKF, EPTR", "QPOE, PEOL, WJRN, VCNS, PEKF, PFPW" ) 

key <- structure(list(Items = c("ALAO", "ALLF", "ALPQ", "CNIR", "EPTR", 
"FKKF", "FKOF", "FLEP", "GOEK", "JFOKE", "JFPG", "KENC", "KFDL", 
"KJTJ", "LFOD", "LSPF", "PEKF", "PEOL", "PFOW", "PFPW", "POQK", 
"PRCP", "PWEO", "PWEOR", "PWKR", "QPOE", "VCNS", "WJRN", "WOWP" 
), A = c(NA, 0.016262491, 0.409770566, NA, 0.718354484, 0.801489091, 
0.643251028, 0.018262707, 0.902121539, 0.808410498, NA, 0.882285296, 
0.077569421, 0.249613609, NA, 0.088451014, 0.645309773, 0.626916187, 
0.86690534, NA, 0.683221579, 0.486488748, 0.665854791, 0.611034332, 
NA, 0.815885005, 0.394817612, 0.403002388, 0.794250738), B = c(0.12246503, 
0.557522799, 0.770904525, 0.38075281, 0.290028597, 0.878405308, 
0.131643544, 0.211220859, NA, 0.301443669, NA, 0.372821865, 0.076497291, 
0.227241864, 0.000343115, 0.65148309, NA, 0.093812247, 0.596673645, 
0.018869604, NA, 0.860947689, 0.814111848, 0.17254104, NA, 0.083834541, 
0.250760686, 0.705142265, NA), C = c(0.137902549, 0.622560763, 
NA, 0.698236443, 0.525661861, 0.645004844, NA, 0.457302727, NA, 
0.575188395, 0.343824191, 0.593742731, NA, NA, 0.329546051, 0.267490643, 
0.116601451, 0.152577881, NA, NA, 0.472456955, 0.097916066, 0.026085774, 
0.212386401, 0.357298987, NA, 0.419539549, 0.768961818, 0.967405211 
)), .Names = c("Items", "A", "B", "C"), class = "data.frame", row.names = c(NA, -29L)) 

#split it up as you suggest 
d <- strsplit(d,",") 
d <- lapply(d, gsub, pattern=" ", replacement="") #Get rid of trailing spaces 

#Convert key to a long data.frame with no NAs 
library(reshape2) 
key <- melt(key) 
names(key)[2] <- "letter" #You might have better name for this 
key <- key[complete.cases(key),] 

#Extract subsets for each row of data 
lapply(d, function(x)key[key$Items %in% x,]) 
+0

注意KJTJ数据只有两个出三个值的 - 你应该检查这是为什么。 – Miff

+0

工作很好,谢谢!我永远不会想到这样做。你使用的列表格式是完美的,比我所建议的更好。另外,我在KJTJ的NA中加入了 - 我想在编辑帖子时我失去了它。 – syntonicC