如何使用后面n行的值创建新列

  • 本文关键字:创建 新列 何使用 r
  • 更新时间 :
  • 英文 :


我有一个data.frame对象和一个参数parm,它表示它之后将与自己一起使用的行数。

数据看起来是这样的;

parm <- 3
df <- data.frame(a=LETTERS[1:5])
df
a    
<chr>
1 A    
2 B    
3 C    
4 D    
5 E    

如果不可能的话,应该减少要使用的行数,如果我需要用期望的输出来解释它;

a     des_column
<chr> <chr>     
1 A     A,B,C     
2 B     B,C,D     
3 C     C,D,E     
4 D     D,E       
5 E     E         

baseR函数会更好。

提前谢谢。

您可以在所有行中应用,确保所需的长度不会超过行数并粘贴在一起。

n <- nrow(df)
df$des_column <- sapply(
1:n,
(x) paste(df$a[x:min(x+parm-1, n)], collapse = ",")
)
df
#>   a des_column
#> 1 A      A,B,C
#> 2 B      B,C,D
#> 3 C      C,D,E
#> 4 D        D,E
#> 5 E          E

(x)是R 4.1中发布的function(x)的缩写

另一种可能的解决方案,基于zoo::rollapply:

library(zoo)
parm <- 3
df <- data.frame(a=LETTERS[1:5])
df$des_column <- rollapply(df$a, parm, paste, collapse = ",",
partial=T, align="left")
df
#>   a des_column
#> 1 A      A,B,C
#> 2 B      B,C,D
#> 3 C      C,D,E
#> 4 D        D,E
#> 5 E          E

使用上面的相同逻辑,另一种方法是:

library(tidyverse)
df$des_column <- map_chr(seq_len(nrow(df)),
function(i) glue_collapse(df$a[i:min(i+parm-1, nrow(df))], sep = ','))
#>   a des_column
#> 1 A      A,B,C
#> 2 B      B,C,D
#> 3 C      C,D,E
#> 4 D        D,E
#> 5 E          E

最新更新