2014-04-16 43 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