r - 在 R 中,将数据框对角线转换为行

标签 r dataframe diagonal

我正在开发一个模型来预测一个年龄段的完全生育率。我目前有一个这样的数据框,其中行是年龄,列是年。每个单元格中的值是该年的特定年龄生育率:

> df1
   iso3    sex age fert1953 fert1954 fert1955
14  AUS female  13    0.000  0.00000  0.00000
15  AUS female  14    0.000  0.00000  0.00000
16  AUS female  15   13.108 13.42733 13.74667
17  AUS female  16   26.216 26.85467 27.49333
18  AUS female  17   39.324 40.28200 41.24000

但是,我想要的是每一行都是一个队列。因为行和列代表个别年份,所以可以通过对角线获得队列数据。我正在寻找这样的结果:
> df2
   iso3    sex ageIn1953 fert1953  fert1954  fert1955
14  AUS female        13    0.000   0.00000  13.74667
15  AUS female        14    0.000  13.42733  27.49333
16  AUS female        15   13.108  26.85467  41.24000
17  AUS female        16   26.216  40.28200  [data..] 
18  AUS female        17   39.324  [data..]  [data..] 

这是df1数据框:
df1 <- structure(list(iso3 = c("AUS", "AUS", "AUS", "AUS", "AUS"), sex = c("female", 
"female", "female", "female", "female"), age = c(13, 14, 15, 
16, 17), fert1953 = c(0, 0, 13.108, 26.216, 39.324), fert1954 = c(0, 
0, 13.4273333333333, 26.8546666666667, 40.282), fert1955 = c(0, 
0, 13.7466666666667, 27.4933333333333, 41.24)), .Names = c("iso3", 
"sex", "age", "fert1953", "fert1954", "fert1955"), class = "data.frame", row.names = 14:18)

编辑:

这是我最终使用的解决方案。它基于大卫的回答,但我需要为 iso3 的每个级别执行此操作.
df.ls <- lapply(split(f3, f = f3$iso3), FUN = function(df1) {
  n <- ncol(df1) - 4
  temp <- mapply(function(x, y) lead(x, n = y), df1[, -seq_len(4)], seq_len(n))
  return(cbind(df1[seq_len(4)], temp))
})
f4 <- do.call("rbind", df.ls)

最佳答案

我还没有测试过速度,但是 data.table v1.9.5 ,最近实现了一个名为 shift 的新(用 C 语言编写)超前/滞后函数

因此,对于您想要移动的列,您可以将它与 mapply 结合使用。 , 例如

library(data.table)
n <- ncol(df1) - 4 # the number of years - 1
temp <- mapply(function(x, y) shift(x, n = y, type = "lead"), df1[, -seq_len(4)], seq_len(n))
cbind(df1[seq_len(4)], temp) # combining back with the unchanged columns
#    iso3    sex age fert1953 fert1954 fert1955
# 14  AUS female  13    0.000  0.00000 13.74667
# 15  AUS female  14    0.000 13.42733 27.49333
# 16  AUS female  15   13.108 26.85467 41.24000
# 17  AUS female  16   26.216 40.28200       NA
# 18  AUS female  17   39.324       NA       NA

编辑:您可以轻松安装data.table的开发版从 GitHub 使用
library(devtools) 
install_github("Rdatatable/data.table", build_vignettes = FALSE)

无论哪种方式,如果你想要 dplyr , 开始
library(dplyr)
n <- ncol(df1) - 4 # the number of years - 1
temp <- mapply(function(x, y) lead(x, n = y), df1[, -seq_len(4)], seq_len(n))
cbind(df1[seq_len(4)], temp)
#    iso3    sex age fert1953 fert1954 fert1955
# 14  AUS female  13    0.000  0.00000 13.74667
# 15  AUS female  14    0.000 13.42733 27.49333
# 16  AUS female  15   13.108 26.85467 41.24000
# 17  AUS female  16   26.216 40.28200       NA
# 18  AUS female  17   39.324       NA       NA

关于r - 在 R 中,将数据框对角线转换为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27849171/

相关文章:

r - mutate & rowwise & grepl 的替代品

python - 在python中将数据帧打印到.csv。 TypeError :must be convertible to a buffer

python - 理论上,对于 Apache Spark,Scala 比 Python 更快。实际上并非如此。这是怎么回事?

android - 用三角形绘制android xml形状对角线

mysql - 将access 2007链接到mysql

r - 将 mapply 的输出修改为数据帧

matlab - Matlab中的扩展分块对角矩阵

python-3.x - 如何使用 itertools 继续使用列表中的值,直到矩阵的对角线已满

css - 仅在 Shiny 仪表板的特定 tabItem 上应用 css 格式

python - 如何在新数据框中存储多索引数据框的子集?