来自网页抓取的数据被保存到一个列表中。然而,有些元素并不是在每个页面上都可用,这导致列表具有不同长度的字符向量(如果所有数据都存在,则为4,如果所有数据都不存在,则为3)。
由于我需要保留列表的特定结构,所以我决定将相同的值附加到所有缺少数据的记录。
手动执行此操作是可行的,但是当尝试编写循环时,它最终会用附加的值替换缺失的值,从而导致长度为1的字符向量。
一些示例数据:
things <- list(c("red", "small", "expensive", "car"),
c("big", "expensive", "bike"),
c("green", "big", "cheap", "bike"),
c("small", "expensive", "car"))
假设我们知道所有缺少第一条记录(颜色)的东西都是蓝色的,手动追加它就可以正常工作,例如,为第二条记录返回(“blue”“big”“expensive”“bike”)。
c("blue", things[[2]])
然而,试图将其转换为一个循环来遍历所有数据,基于字符长度的ifelse语句,它将整个向量替换为“blue”而不是追加它。
all_things <- list()
for(i in seq_along(things)) {
all_things[i] <- ifelse(length(things[[i]]) == 3, c("blue", things[[i]]), things[i])
}
运行循环将返回:
1[1]“红”“小”“贵”“车”
2[1]“蓝色”
3[1]“绿色”“大”“便宜”“自行车”
4[1]“蓝色”
非常感谢你的帮助!
7条答案
按热度按时间8gsdolmq1#
我会分两步来做:
1.在 all 列表项前添加“missing”值
1.只取每个列表项的最后4个值
这个两步过程意味着我们不需要使用
ifelse
,也不需要循环:结果:
这是非常罕见的情况之一,其中
append
而不是c
是合适的(即使我们 prepend;再次显示append
被错误命名)。idfiyjo82#
如果使用base R,可以尝试
lengths
+Map
r1zhe5dt3#
你也可以用
np8igboo4#
您可以使用
lapply
来检查您的条件,即mccptt675#
创建于2023-03-22带有reprex v2.0.2
yacmzcpb6#
您可以使用lapply循环并在每个长度为3的向量前面添加“blue”
6rqinv9w7#
你可以像这样修改你的代码:
这里我们使用
[[
代替[
,使用if () {} else {}
代替ifelse
。您应该研究ifelse
的文档。