我有一个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
base
R函数会更好。
提前谢谢。
您可以在所有行中应用,确保所需的长度不会超过行数并粘贴在一起。
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