相当于R中字符串的总和
我正在寻找一种方法,可以对字符串/字符格式的文本(而不是数字)进行R中的累积和。不同的文本字段应该连接在一起 例如,在数据框“df”中: A列包含输入,B列包含所需结果相当于R中字符串的总和,r,R,我正在寻找一种方法,可以对字符串/字符格式的文本(而不是数字)进行R中的累积和。不同的文本字段应该连接在一起 例如,在数据框“df”中: A列包含输入,B列包含所需结果 A B 1 banana banana 2 boats banana boats 3 are banana boats are 4 awesome banana boats are awesome 目前,我正在通过以下循环解决此问题 df$B <- "" for(i in 1:
A B
1 banana banana
2 boats banana boats
3 are banana boats are
4 awesome banana boats are awesome
目前,我正在通过以下循环解决此问题
df$B <- ""
for(i in 1:nrow(df)) {
if (length(df[i-1,"A"]) > 0) {
df$B[i] <- paste(df$B[i-1],df$A[i])
} else {
df$B[i] <- df$A[i]
}
}
df$b0){
df$B[i]我不知道它是否更快,但至少代码更短:
sapply(seq_along(df$A),function(x){paste(A[1:x], collapse=" ")})
多亏了Rolands的评论,我意识到这是很少出现的for循环有用的情况之一,因为它节省了我们重复的索引。它不同于OP,因为它从2开始,节省了对for循环内部if station的需要
res <- c(NA, length(df1$A))
res[1] <- as.character(df1$A[1])
for(i in 2:length(df1$A)){
res[i] <- paste(res[i-1],df1$A[i])
}
res
res我们可以试试
i1 <- sequence(seq_len(nrow(df1)))
tapply(df1$A[i1], cumsum(c(TRUE,diff(i1) <=0)),
FUN= paste, collapse=' ')
i1(df$B这根本不是“cumsum”!性能有问题吗?我认为经典的cumpase
首先出现(可能重复).Cudos to@alexis_laz.,尽管也像上面的答案一样是“按组”。但“按组”很少是棘手的部分…感谢所有的答案!发现Reduce是最快的,因此被标记为顶部答案。很抱歉,这是重复的!似乎我搜索了错误的术语。令人印象深刻,速度惊人。(在1000个字符串的输入向量上,比我的解决方案快20倍)@Heroka Reduce只是一个循环。@Roland so很聪明,但在我的机器上Reduce
把其他答案都吹了出来。我认为是Accumate=TRUE
@Heroka是的。显然它比你的方法更好地处理积累问题,但它只是一个很好的语法糖。如果你看看内部的你会看到标准的for
循环。@Roland它“不仅仅”是一个for循环。解释速度提高的原因还有很多。首先,你有强制调用(请参见?forceAndCall
。更重要的是,Reduce
函数已经编译成字节码。任何编译过的代码都会优于a“手工制作”的循环。所以称之为语法糖是对函数的不公平。
i1 <- rep(seq(nrow(df1)), seq(nrow(df1)))
tapply(i1, i1, FUN= function(x)
paste(df1$A[seq_along(x)], collapse=' ') )
(df$B <- Reduce(paste, as.character(df$A), accumulate = TRUE))
# [1] "banana" "banana boats" "banana boats are" "banana boats are awesome"