R 绑定具有不同时间观测值的两个数据帧

问题描述 投票:0回答:2

我有两个数据框f1和f2

row11 <- c("a", "c", "2000", "2001", "2005")
row12 <- c("", "", 7, 10, 15)

f1 <- as.data.frame(rbind(row11, row12))

row21 <- c("a", "b", "c", "2002", "2005")
row22 <- c("", "", "", 1, 15)

f2 <- as.data.frame(rbind(row21, row22)) 

我想以这样的方式绑定这两个数据框,我得到数据框f3:

row31 <- c("a", "b", "c", seq(2000,2005,1))

row32 <- c("", "", "", 7, 10, NA, NA, NA, 15)

row33 <- c("", "", "", NA, NA, 1, NA, NA, 15)

f3 <- rbind(row32, row33)
colnames(f3)  <- row31 

f3:

      a  b  c  2000 2001 2002 2003 2004 2005
row32 "" "" "" "7"  "10" NA   NA   NA   "15"
row33 "" "" "" NA   NA   "1"  NA   NA   "15"

f3 采用列名称“a”、“b”和“c”,并添加从 2000 年到 2005 年的时间序列以及 f1 和 f2 中的相应值。

我更喜欢 dplyr 的解决方案。

r dplyr rbind
2个回答
0
投票

从 row1 和 row2 数据帧创建两个数据帧,然后使用

dplyr
绑定它们的简单方法。

I 转置 (

t(...)
) 两个行向量,
row12
row22
,因为
data.frame
需要列输入,而不是向量输入。

转置原子向量会创建一个可用于

data.frame
输入的矩阵。

row11 <- c("a", "c", "2000", "2001", "2005")
row12 <- c("", "", 7, 10, 15)

row21 <- c("a", "b", "c", "2002", "2005")
row22 <- c("", "", "", 1, 15)

f1 <- data.frame(t(row12))
colnames(f1)<- row11

f2 <- data.frame(t(row22)) 
colnames(f2) <- row21

f3 <- dplyr::bind_rows(f1, f2)

然后,f3 的输出(如果需要,您可以重新排列列):

> f3
  a c 2000 2001 2005    b 2002
1        7   10   15 <NA> <NA>
2     <NA> <NA>   15         1

以及原子向量转置输出的演示:

> t(row12)
     [,1] [,2] [,3] [,4] [,5]
[1,] ""   ""   "7"  "10" "15"
> t(row12) |> class()
[1] "matrix" "array" 

0
投票

您可以尝试以下(主要是)dplyr 解决方案,该解决方案在重命名并删除第一行后绑定行,然后对列进行排序。

虽然我确信有一种更优雅的方法,但我使用一点基本 R 添加缺失的年份列,然后重新排序:

f3_temp <- f1 %>%
  setNames(unlist(f1[1,])) %>%
  slice(-1) %>%
  bind_rows(f2 %>% 
              setNames(unlist(f2[1,])) %>%
              slice(-1))

# add in missing year columns
num_names <- as.numeric(names(f3_temp)) %>% 
  drop_na()
new_names <- setdiff(seq(min(num_names), max(num_names), 1L), names(f3_temp))
f3_temp[as.character(new_names)] <- NA

# reorder columns:
f3 <- f3_temp %>% 
  select(order(nchar(colnames(.)), colnames(.)))

输出:

#       a    b c 2000 2001 2002 2003 2004 2005
# row12             7   10 <NA>   NA   NA   15
# row22          <NA> <NA>    1   NA   NA   15
© www.soinside.com 2019 - 2024. All rights reserved.