如何避免 R 中的循环:从列表中选择项目

2024-01-01

我可以使用循环来解决这个问题,但我正在尝试用向量来思考,这样我的代码将更加 R 风格。

我有一份名单。格式为名字_姓氏。我想从这个列表中得到一个只有名字的单独列表。我似乎不知道如何做到这一点。以下是一些示例数据:

t <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan")
tsplit <- strsplit(t,"_")

看起来像这样:

> tsplit
[[1]]
[1] "bob"   "smith"

[[2]]
[1] "mary" "jane"

[[3]]
[1] "jose"  "chung"

[[4]]
[1] "michael" "marx"   

[[5]]
[1] "charlie" "ivan"   

我可以使用这样的循环得到我想要的东西:

for (i in 1:length(tsplit)){
    if (i==1) {t_out <- tsplit[[i]][1]} else{t_out <- append(t_out, tsplit[[i]][1])} 
}

这会给我这个:

t_out
[1] "bob"     "mary"    "jose"    "michael" "charlie"

那么我怎样才能在没有循环的情况下做到这一点呢?


还有一种方法:

t <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan")
pieces <- strsplit(t,"_")
sapply(pieces, "[", 1)

换句话说,最后一行提取列表中每个组件的第一个元素,然后将其简化为向量。

这是如何运作的?好吧,你需要实现另一种写作方式x[1] is "["(x, 1),即有一个函数称为[进行子集化。这sapplycall apply 对原始列表的每个元素调用此函数一次,并传入两个参数:列表元素和 1。

与其他方法相比,此方法的优点是您可以从列表中提取多个元素,而无需重新计算拆分。例如,姓氏是sapply(pieces, "[", 2)。一旦你习惯了这个习语,它就很容易阅读。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免 R 中的循环:从列表中选择项目 的相关文章

随机推荐