如何在不同长度的数据框中添加行和列?

时间:2018-11-18 17:24:57

标签: r

我有两个长度不同的数据框:

Headers <- data.frame(x = paste0("x", 1:4), y = 1:4)
Dataset <- data.frame(H = c(20, 10, 11, 8, 10), W = c(30, 20, 30, 10, 6)) 

Headers
   x y
1 x1 1
2 x2 2
3 x3 3
4 x4 4

Dataset
   H  W
1 20 30
2 10 20
3 11 30
4  8 10
5 10  6

我需要将列“ x”从“标头”转换为标头,并将列“ y”转换为相应的值,然后绑定到“数据集”:

H   W  x1  x2  x3  x4
20  30  1   2   3   4
10  20  1   2   3   4
11  30  1   2   3   4
 8  10  1   2   3   4
10   6  1   2  3    4

这是我尝试的代码:

 H <- t(Headers)
 Dataset <- cbind(H, Dataset)
 names(H)  <- NULL
 Dataset <- qpcR:::cbind.na(H, Dataset)

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

转置'y'并重复至所需的行数。将列名称设置为“ x”。

cbind(Dataset, `colnames<-`(t(Headers$y)[rep(1, nrow(Dataset)), ], Headers$x))

   H  W x1 x2 x3 x4
1 20 30  1  2  3  4
2 10 20  1  2  3  4
3 11 30  1  2  3  4
4  8 10  1  2  3  4
5 10  6  1  2  3  4

答案 1 :(得分:0)

一种data.table方法:

library(data.table)

cbind(Dataset, dcast(Headers, . ~ x, value.var = "y")[,-1])

输出:

   H  W x1 x2 x3 x4
1 20 30  1  2  3  4
2 10 20  1  2  3  4
3 11 30  1  2  3  4
4  8 10  1  2  3  4
5 10  6  1  2  3  4

一种tidyverse方法:

library(tidyverse)

Headers %>%
  rownames_to_column %>%
  spread(x, y) %>%
  summarise_all(funs(first(na.omit(.)))) %>%
  cbind(Dataset, .) %>% select(-rowname)

输出:

   H  W x1 x2 x3 x4
1 20 30  1  2  3  4
2 10 20  1  2  3  4
3 11 30  1  2  3  4
4  8 10  1  2  3  4
5 10  6  1  2  3  4

答案 2 :(得分:0)

您也可以使用基本R

dotnet Tannery.dll