R:每列中的strsplit;错误:替换元素1具有[y]行以替换1行

时间:2018-05-30 17:58:37

标签: r strsplit

我正在使用R中的数据框(我将其称为'字母'),其中有15行乘2列。每列2包含类似“A | B | C | D | E”的字符串。我想在每个地方拆分字符串|似乎得到向量c(“A”,“B”,“C”,“D”,“E”)。以下是我对如何做到这一点的最好想法:

for(i in 1:nrow(letters)){
  letters[i,2] <- strsplit(letters[i,2], split = "[|]")
}

我得到了一个与讨论here类似的错误(“替换有[x]行,数据有[y]”),它似乎试图为输出向量的每个索引创建一个单独的列。我确信这是一个简单的问题,但我是R的新手并坚持下去。

2 个答案:

答案 0 :(得分:0)

SELECT DISTINCT dog_id FROM (SELECT dog_id FROM dog_bounds AS db, frisbees AS f WHERE db.max_x >= f.min_x AND db.max_y >= f.min_y AND db.min_x < f.max_x AND db.min_y < f.max_y); 您要找的是什么?您将无法将该向量放回SELECT DISTINCT dog_id FROM (SELECT dog_id FROM dog_bounds AS db, frisbees AS f WHERE db.max_x >= f.min_x AND db.max_y >= f.min_y AND db.min_x < f.max_x AND db.min_y < f.max_y LIMIT -1); ,但因为它的长度为5(而不是1)。

答案 1 :(得分:0)

你的第二栏是(我认为)一个角色向量。 strsplit正如文档中提到的那样(?strsplit)返回一个列表。在我们进入为什么您的具体情况发生之前,一些一般建议:

  1. 制作新列,而不是替换现有列。这样做的好处是不会丢失原始值。
  2. 仅使用相同类的新值替换列中的值(例如,字符为字符,整数为整数)。
  3. 所以我建议添加一个新的拆分值列:

    letters[["splits"]] <- strsplit(letters[[2]], split = "|", fixed = TRUE)
    

    您现在有一个列表列,此列的每一行都有一个原始值的拆分字母向量。

    为什么你的问题发生

    让我们剖析赋值语句:

    letters[i,2] <- strsplit(letters[i,2], split = "[|]")
    

    <-的左侧是letters[i, 2],这是data.framedata.frame将所有数据存储在列表中。 R允许我们使用这个事实,特别是在任务中。我们可以像添加或替换列表中的项一样添加或替换列。

    # This...
    letters[, "one"] <- 1
    letters[, "two"] <- 2
    # is effectively the same as this
    letters[, c("one", "two")] <- list(1, 2)
    

    ->的右侧,我们打电话给strsplit(),后者返回list。如上面的示例所示,如果您将列表分配给data.frame的子集,则会将其强制转换为data.frame本身。列表中的每个元素都将被视为一列。所以,作业就像这样:

    1. 如果letters[i,2]"A|B|C|D|E",则strsplit(letters[i,2], split = "[|]")list(c("A", "B", "C", "D", "E"))
    2. 分配检查双方,并将data.frame视为“更高”类型,因此它将列表强制转换为data.frame。右侧现在有效data.frame(c("A", "B", "C", "D", "E"))
    3. 现在,它尝试将data.frame分配1列,将 5行分配给具有1列且 1行的子集。那些尺寸不匹配,所以它从右侧(只是第一行)采取了它可以做的事情并警告你发生的事情。
    4. 为什么建议的作业

      那为什么没有强制呢?

      letters[["splits"]] <- strsplit(letters[[2]], split = "|", fixed = TRUE)
      

      左侧使用[[子集(将data.frame视为列表)来添加或替换"splits"列。因此,没有任何强制行为。

      此外,data.frame可以将list作为列,就像list可以将list作为元素一样。 data.frame列必须满足两件事:

      1. 它必须是一个载体。
      2. 其长度必须等于data.frame中的行数(必要时会尝试回收)。
      3. list是一种向量。 strsplit()返回与输入长度相同的列表,因此符合两个条件。