根据现有行向数据框添加行

bee*_*oot 3 r dataframe

我有这个数据帧:

df <- data.frame(group=c("A", "A", "B", "B"), year=c(1980, 1986, 1990, 1992))
  group year
1     A 1980
2     A 1986
3     B 1990
4     B 1992
Run Code Online (Sandbox Code Playgroud)

我想通过以下方式修改它:

  • 使用前两年为每个现有行添加行
  • 添加一个包含相应年份变量的新列
  • 删除现有行

这将是结果:

   group  year     pre
1      A  1978 pre1980
2      A  1979 pre1980
3      A  1984 pre1986
4      A  1985 pre1986
5      B  1988 pre1990
6      B  1989 pre1990
7      B  1990 pre1992
8      B  1991 pre1992
Run Code Online (Sandbox Code Playgroud)

添加新列很容易..

df$pre <- paste("pre", df$year, sep="")
Run Code Online (Sandbox Code Playgroud)

但我仍然坚持如何添加相应年份的新行(当然创建一个全新的数据框架也同样好).任何提示?

Pie*_*une 6

base R FTW:

data.frame(group = rep(df$group, each=2),
           year = df[rep(1:nrow(df), each=2),]$year-2:1,
           pre = paste0("pre",rep(df$year,each=2)))
#   group year     pre
# 1     A 1978 pre1980
# 2     A 1979 pre1980
# 3     A 1984 pre1986
# 4     A 1985 pre1986
# 5     B 1988 pre1990
# 6     B 1989 pre1990
# 7     B 1990 pre1992
# 8     B 1991 pre1992
Run Code Online (Sandbox Code Playgroud)

  • FTW?世界?我和男人一样. (4认同)

jaz*_*rro 5

使用data.table包,这是一种方法.根据给定的数据,我决定使用year作为组变量.对于每一年,我计算前两年,并创建年份前的****.有两年的专栏,所以我最后删除了其中一列.

setDT(df)[, list(group = group,
                 year = c((year - 2), (year - 1)),
                 pre = paste0("pre", year, collapse = "")), by = "year"][, -1, with = FALSE][]

#   group year     pre
#1:     A 1978 pre1980
#2:     A 1979 pre1980
#3:     A 1984 pre1986
#4:     A 1985 pre1986
#5:     B 1988 pre1990
#6:     B 1989 pre1990
#7:     B 1990 pre1992
#8:     B 1991 pre1992
Run Code Online (Sandbox Code Playgroud)

如果你有相同的一年出现两次以上,你会做类似以下的事情.这个新的数据框架在1992年出现了两次.

df <- data.frame(group=c("A", "A", "B", "B"), year=c(1980, 1986, 1992, 1992))


setDT(df)[, list(group = group,
                 year = c((year - 2), (year - 1)),
                 pre = paste0("pre", year, collapse = "")), by = rownames(df)][, -1, with = FALSE]


#   group year     pre
#1:     A 1978 pre1980
#2:     A 1979 pre1980
#3:     A 1984 pre1986
#4:     A 1985 pre1986
#5:     B 1990 pre1992
#6:     B 1991 pre1992
#7:     B 1990 pre1992
#8:     B 1991 pre1992
Run Code Online (Sandbox Code Playgroud)