Home > Blockchain >  How to create a new column using the values of the next n rows?
How to create a new column using the values of the next n rows?

Time:02-04

I have a data.frame object and a parameter parm which represents how many lines after it will be used with itself.

data is looking so;

parm <- 3

df <- data.frame(a=LETTERS[1:5])

df

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

The number of rows to be used should be reduced if not possible, If I need to explain it with the desired output;

  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 functions would be much better.

Thanks in advance.

CodePudding user response:

You could just apply across all the rows, ensuring your desired length doesn't overrun the number of rows and paste together.

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) is shorthand for function(x) released in R 4.1

CodePudding user response:

Another possible solution, based on 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

CodePudding user response:

Using the same logic from above, another way would be:

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
  •  Tags:  
  • Related