【问题标题】:Data munging in R: Subsetting and arranging vectors of uneven lengthR中的数据处理:不均匀长度的子集和排列向量
【发布时间】:2014-04-16 08:05:16
【问题描述】:

很抱歉,我无法给出更具体的标题。我正试图让自己摆脱电子表格来完成更困难的任务,而这给我带来了特别的麻烦——我可以在 Excel 中完成,但我真的不知道如何从 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

一般做法如下:

data 中显示的每一行都来自电子表格的一个单元格,因此如果直接导入,R 会将其解释为一个字符串。将每一行的字符串拆分成可以在R中存储为向量的形式。

根据与其关联的行中的值,将数据过滤为三个类别(A、B 或 C)。例如,对于 data 的第 5 行,我们的值是:QPOE, PEOL, WJRN, VCNS, PEKF, PFPW。查看 key,我们可以根据 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

所以我们有一种哈希表......有点。现在我想将这些值存储在一个表中。它在最终形式中基本上看起来像这样(仅显示在 data 的第 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
    • 一个项目
      • 价值观
    • B 项目
      • 价值观
    • C 项目
      • 价值观
  2. 猫排 2...

我只是犹豫是否要为这些数据制作数据框,因为我的原始 数据 中的行长度在分为 A、B 和 C 时变化很大。最短的那些必须让 NA 填充到最长的长度以适合数据框。这件事让我感到不舒服。

我总是可以查找答案中使用的函数并找出答案,因此除非您觉得特别慷慨,否则无需深入解释!感谢您的宝贵时间。

【问题讨论】:

    标签: r import subset spreadsheet data-munging


    【解决方案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,])
    

    【讨论】:

    • 请注意,数据中的 KJTJ 只有三分之二的值 - 您应该检查这是为什么。
    • 效果很好,谢谢!我从来没有想过这样做。您使用的列表格式非常完美,比我建议的要好。另外,我为 KJTJ 添加了一个 NA - 我想我在编辑我的帖子时不知何故丢失了它。
    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 2018-06-11
    • 2017-01-07
    • 1970-01-01
    • 2022-10-07
    • 2019-10-03
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多