如何在R中实现向量化操作,使其输出与b_loop完全一致?
实现与b_loop输出一致的向量化方法
你的b_loop代码实际是把col1的第一个元素重复填充到整个列里(第一个元素保持1,后面所有元素都变成1),完全可以用向量化方法实现,不需要循环:
方法1:用dplyr的cumfirst函数
这是最贴合dplyr管道风格的写法:
require(dplyr) a <- data.frame(col1 = 1:10) b_vectorize <- a %>% mutate(col1 = cumfirst(col1))
cumfirst函数会取列的第一个元素,然后后续所有位置都保留这个值,正好和循环的逻辑完全匹配。
方法2:Base R原生向量化操作
如果不想依赖dplyr,直接用Base R也能快速实现:
a <- data.frame(col1 = 1:10) b_vectorize <- a b_vectorize$col1 <- rep(a$col1[1], nrow(a))
或者用transform函数更简洁:
b_vectorize <- transform(a, col1 = rep(col1[1], nrow(a)))
直接重复第一个元素到整个列,纯向量化操作,效率比循环高很多。
方法3:dplyr结合first和n()
也可以用first函数获取第一个元素,再用n()获取数据框行数来重复:
b_vectorize <- a %>% mutate(col1 = rep(first(col1), n()))
运行以上任意一种方法后,print(b_vectorize)的输出都会和print(b_loop)完全一致。
内容的提问来源于stack exchange,提问作者rivas
相关产品推荐
相关产品推荐

