Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相当于R中字符串的总和_R - Fatal编程技术网

相当于R中字符串的总和

相当于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:

我正在寻找一种方法,可以对字符串/字符格式的文本(而不是数字)进行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: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"