r - 在新列中连接当前行和后续行

标签 r loops dataframe concatenation

假设我们在 R 中有这个数据框:

df <- data.frame(id = c(rep(1,5), rep(2, 3), rep(3, 4), rep(4, 2)), brand = c("A", "B", "A", "D", "Closed", "B", "C", "D", "D", "A", "B", "Closed", "C", "Closed"))

> df
#   id  brand
#1   1      A
#2   1      B
#3   1      A
#4   1      D
#5   1 Closed
#6   2      B
#7   2      C
#8   2      D
#9   3      D
#10  3      A
#11  3      B
#12  3 Closed
#13  4      C
#14  4 Closed

我想创建一个新变量来表示品牌列中从当前行到下一行的变化,但这只能发生在每个 ID 号内。

我创建新列:

df$brand_chg <- ""

这个循环正确地完成了我想做的事情:

for (i in 1:nrow(df)) {

    j <- i + 1

    if(j > nrow(df)) next #to prevent error in very last row

    if (df[i,'id'] != df[j, 'id']) next #to skip loop when id changes

    df[i,'brand_chg'] <- paste(df[i,'brand'], df[j,'brand'], sep = "->") 
    #populating concatenation
}

#Results:
#   id  brand brand_chg
#1   1      A      A->B
#2   1      B      B->A
#3   1      A      A->D
#4   1      D D->Closed
#5   1 Closed          
#6   2      B      B->C
#7   2      C      C->D
#8   2      D          
#9   3      D      D->A
#10  3      A      A->B
#11  3      B B->Closed
#12  3 Closed          
#13  4      C C->Closed
#14  4 Closed 

但是,在具有 287k 行的表上,此循环至少需要运行 10 分钟。有谁知道完成这种串联的更快方法吗?

谢谢,我很欣赏你的见解。

最佳答案

使用 dplyr 包:

library(dplyr)

df %>% group_by(id) %>% 
    mutate(brand_chg = ifelse(seq_along(brand) == n(), 
                              "", 
                              paste(brand, lead(brand), sep = "->")))

关于r - 在新列中连接当前行和后续行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43813745/

相关文章:

python - 通过具有 NaN 值的数据帧更新数据帧

r - paste0 或 paste 在遇到 r 中的特殊字符时失败

R 在 Dataframe 中包含字符串列表

r - 如何在给定的指定区域生成随机形状。(R语言)?

循环内的 JavaScript 闭包 – 简单的实际示例

javascript - for 循环中的问题

python - 使用 Pandas,如何匹配系列中的多个索引、匹配 DataFrame 并替换多列

r - 多重 geom_sf 色彩美学(离散+连续)

mysql - 如果返回记录则退出循环

r - 将函数应用于数据框的子集但保留整个数据框