我有两个.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
如您所见,我需要复制第一个数据帧的行,然后只添加第二个数据帧的一年,以便所有年份都出现在一列中。
答案 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)
解决方案使用dplyr
和tidyr
中的函数,这与@ D.sen的解决方案几乎相同。但我将每个操作放在一个管道中,并使用left_join
来执行merge
功能。我尝试使用select
和arrange
来模仿您想要的输出,但这些都是可选的。 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
中。