组合两个Dataframe,使所有年份都出现在一列中

时间:2017-08-26 14:56:40

标签: r dataframe merge

我有两个.csv文件,我将其作为数据框读入。

1)

Tree1  var1  var2  var3
Tree2  var1  var2  var3


2)

Tree1 year1  year2  year3
Tree2 year1  year2  year3

期望的输出:

3)

Tree1  var1  var2  var3  year1
Tree1  var1  var2  var3  year2
Tree1  var1  var2  var3  year3
Tree2  var1  var2  var3  year1
Tree2  var1  var2  var3  year2
Tree2  var1  var2  var3  year3

如您所见,我需要复制第一个数据帧的行,然后只添加第二个数据帧的一年,以便所有年份都出现在一列中。

3 个答案:

答案 0 :(得分:4)

首先读入数据。下面的复制数据集具有不明确的列名称。

df1 <- data.frame(x1 = c("Tree1", "Tree2"),
           x2 = c("var1", "var1"),
           x3 = c("var2", "var2"),
           x4 = c("var3", "var3"))
df2 <- data.frame(x1 = c("Tree1", "Tree2"),
           x2 = c("year1", "year1"),
           x3 = c("year2", "year2"),
           x4 = c("year3", "year3"))

然后加载tidyr包。

install.packages('tidyr')
library(tidyr)

然后收集您的第二个数据集。

df2 <- gather(df2,
      key = "id",
      value = "year",
      -x1)

最后,合并两个数据集。

df <- merge(df2, df1, by = 'x1')

如有必要,请删除id列。

df$id <- NULL

输出看起来像......

> df
     x1  year   x2   x3   x4
 1 Tree1 year1 var1 var2 var3
 2 Tree1 year2 var1 var2 var3
 3 Tree1 year3 var1 var2 var3
 4 Tree2 year1 var1 var2 var3
 5 Tree2 year2 var1 var2 var3
 6 Tree2 year3 var1 var2 var3

答案 1 :(得分:2)

解决方案使用dplyrtidyr中的函数,这与@ D.sen的解决方案几乎相同。但我将每个操作放在一个管道中,并使用left_join来执行merge功能。我尝试使用selectarrange来模仿您想要的输出,但这些都是可选的。 dt3是最终输出。

# Create example datasets
dt1 <- read.table(text = "Tree1  var1  var2  var3
Tree2  var1  var2  var3",
                  header = FALSE, stringsAsFactors = FALSE)

dt2 <- read.table(text = "Tree1 year1  year2  year3
Tree2 year1  year2  year3",
                  header = FALSE, stringsAsFactors = FALSE)

# Load packages
library(dplyr)
library(tidyr)

# Process the data
dt3 <- dt2 %>%
  gather(Value, Year, V2:V4) %>%
  left_join(dt1, by = "V1") %>%
  select(c(paste0("V", 1:4), "Year")) %>%
  arrange(V1)

# See the output
dt3
     V1   V2   V3   V4  Year
1 Tree1 var1 var2 var3 year1
2 Tree1 var1 var2 var3 year2
3 Tree1 var1 var2 var3 year3
4 Tree2 var1 var2 var3 year1
5 Tree2 var1 var2 var3 year2
6 Tree2 var1 var2 var3 year3

答案 2 :(得分:2)

在基数R中,您可以在重塑df2 long之后使用merge。使用dsen帖子中的数据:

merge(df1,
      reshape(df2, direction="long", idvar="x1", varying=list(2:4))[-2],
      by="x1")

返回

     x1 x2.x   x3   x4  x2.y
1 Tree1 var1 var2 var3 year1
2 Tree1 var1 var2 var3 year2
3 Tree1 var1 var2 var3 year3
4 Tree2 var1 var2 var3 year1
5 Tree2 var1 var2 var3 year2
6 Tree2 var1 var2 var3 year3

您可以使用names <- c(...)清理名称,或将上述代码包装在setNames中。