我正在使用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的新手并坚持下去。
答案 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
)返回一个列表。在我们进入为什么您的具体情况发生之前,一些一般建议:
所以我建议添加一个新的拆分值列:
letters[["splits"]] <- strsplit(letters[[2]], split = "|", fixed = TRUE)
您现在有一个列表列,此列的每一行都有一个原始值的拆分字母向量。
让我们剖析赋值语句:
letters[i,2] <- strsplit(letters[i,2], split = "[|]")
<-
的左侧是letters[i, 2]
,这是data.frame
。 data.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
本身。列表中的每个元素都将被视为一列。所以,作业就像这样:
letters[i,2]
为"A|B|C|D|E"
,则strsplit(letters[i,2], split = "[|]")
为list(c("A", "B", "C", "D", "E"))
。data.frame
视为“更高”类型,因此它将列表强制转换为data.frame。右侧现在有效data.frame(c("A", "B", "C", "D", "E"))
。data.frame
分配1列,将 5行分配给具有1列且 1行的子集。那些尺寸不匹配,所以它从右侧(只是第一行)采取了它可以做的事情并警告你发生的事情。那为什么没有强制呢?
letters[["splits"]] <- strsplit(letters[[2]], split = "|", fixed = TRUE)
左侧使用[[
子集(将data.frame
视为列表)来添加或替换"splits"
列。因此,没有任何强制行为。
此外,data.frame
可以将list
作为列,就像list
可以将list
作为元素一样。 data.frame
列必须满足两件事:
data.frame
中的行数(必要时会尝试回收)。 list
是一种向量。 strsplit()
返回与输入长度相同的列表,因此符合两个条件。