在dataframe中创建新列,并以递增方式减少R中的行数

在dataframe中创建新列,并以递增方式减少R中的行数,r,dataframe,R,Dataframe,我对R和编程都比较陌生,有一个包含两列的数据帧,例如: X <- c(2010,2011,2012,2013,2014) Y <- c(1,2,3,4,5) DATA <- data.frame(X,Y) 现在我想创建一些新的列,这些列等于行数减去1。第一个新创建的列应该从第二行开始,每个附加列应该从上一列的下一行开始,直到创建最后一个具有一个值的列为止。 这些值应取自上面一行的Y列 所需的输出如下: X <- c(2010,2011,2012,2013,2014) Y

我对R和编程都比较陌生,有一个包含两列的数据帧,例如:

X <- c(2010,2011,2012,2013,2014)
Y <- c(1,2,3,4,5)
DATA <- data.frame(X,Y)
现在我想创建一些新的列,这些列等于行数减去1。第一个新创建的列应该从第二行开始,每个附加列应该从上一列的下一行开始,直到创建最后一个具有一个值的列为止。 这些值应取自上面一行的Y列

所需的输出如下:

X <- c(2010,2011,2012,2013,2014)
Y <- c(1,2,3,4,5)
NEW_COLUMN_1 <- c(NA,1,2,3,4)
NEW_COLUMN_2 <- c(NA,NA,2,3,4)
NEW_COLUMN_3 <- c(NA,NA,NA,3,4)
NEW_COLUMN_4 <- c(NA,NA,NA,NA,4)
DATA <- data.frame(X,Y,NEW_COLUMN_1,NEW_COLUMN_2,NEW_COLUMN_3,NEW_COLUMN_4)
正如我所说,我是R的新手,不知道如何开始,所以我将感谢您提供的任何帮助

编辑:

除了创建新列之外,我上面的问题是如何使用上面一行Y列中的值填充这些新列。@CPak以非常有效的方式解决了这个问题,见下文

因为返回的值是基于术语functioni dplyr::lagDATA$Y,i,我想知道这个术语是否可以被一个计算替换

例如,对于新创建的列中的每个数据点,返回同一行中Y列的值除以每个新创建列第一个单元格上方行中Y列的值是否容易实现

例如,让我们以新_列_1 DATA[2,3]的第一个单元格为例,其值应为同一行DATA[2,2]:2中的列Y的值除以新_列_1的第一个单元格(即数据[1,2]:1)上方的行1中的列Y的值

由于上述内容确实很复杂,我在所有单元格的坐标下方提供:

X <- c(2010,2011,2012,2013,2014)
Y <- c(1,2,3,4,5)
NEW_COLUMN_1 <- c("NA","DATA[2,2]/DATA[1,2]","DATA[3,2]/DATA[1,2]","DATA[4,2]/DATA[1,2]","DATA[5,2]/DATA[1,2]")
NEW_COLUMN_2 <- c("NA","NA","DATA[3,2]/DATA[2,2]","DATA[4,2]/DATA[2,2]","DATA[5,2]/DATA[2,2]")
NEW_COLUMN_3 <- c("NA","NA","NA","DATA[4,2]/DATA[3,2]","DATA[5,2]/DATA[3,2]")
NEW_COLUMN_4 <- c("NA","NA","NA","NA","DATA[5,2]/DATA[4,2]")
DATA <- data.frame(X,Y,NEW_COLUMN_1,NEW_COLUMN_2,NEW_COLUMN_3,NEW_COLUMN_4)
最终结果应为:

X <- c(2010,2011,2012,2013,2014)
Y <- c(1,2,3,4,5)
NEW_COLUMN_1 <- c(NA,2,3,4,5)
NEW_COLUMN_2 <- c(NA,NA,1.5,2,2.5)
NEW_COLUMN_3 <- c(NA,NA,NA,1.33,1.67)
NEW_COLUMN_4 <- c(NA,NA,NA,NA,1.25)
DATA <- data.frame(X,Y,NEW_COLUMN_1,NEW_COLUMN_2,NEW_COLUMN_3,NEW_COLUMN_4)

非常感谢你的帮助

您可以使用lappy和dplyr::lag创建新列。使用ReduceBind,…将结果列表绑定在一起。。。并转换为data.frame/tible,并使用setNames指定列名


非常感谢,@CPak,解决方案非常有效!因此,部分函数i dplyr::lagDATA$Y返回值。如果要对术语进行计算,是否必须以实质性不同的方式编写?例如,同一行的值除以列X中的行1的值除以列Y中的行1的值?很抱歉,如果这个问题看起来很基本,但我正在努力解决一些问题,我认为这些问题应该是非常直接的,因为在Excel中完成这些工作是多么简单……很抱歉,我不明白作为更复杂计算的一部分,您想做什么。你能编辑你原来的帖子吗。。。描述操作和您期望的输出?谢谢@CPak,谢谢您的反馈!我相应地调整了我原来的帖子,希望我能把自己说得更清楚。抱歉,尽管如此,对于这个复杂的问题。。。
library(tidyverse)
newcols <- Reduce("cbind", lapply(1:(nrow(DATA)-1), function(i) dplyr::lag(DATA$Y, i))) %>%
  as_tibble() %>%
  setNames(paste0("NEW_COLUMN_", 1:ncol(.)))
cbind(DATA, newcols)

     # X Y NEW_COLUMN_1 NEW_COLUMN_2 NEW_COLUMN_3 NEW_COLUMN_4
# 1 2010 1           NA           NA           NA           NA
# 2 2011 2            1           NA           NA           NA
# 3 2012 3            2            1           NA           NA
# 4 2013 4            3            2            1           NA
# 5 2014 5            4            3            2            1