[英]How to take data from one data.frame and put it in another with multiple conditions in R
我有一点问题要弄清楚如何做某事。 我有两个 data.frame,我想将变量添加到一个 date.frame 并在某些条件下将其添加到另一个。 这是我的两个data.frame的摘录:
数据帧 1:
ID YEAR_F
154 2005
432 2005
123 2007
数据框2:
ID Year_D Month DC1 DC2
154 2001 1 4 23
154 2001 2 56 22
154 2005 1 32 11
154 2005 2 12 10
432 2005 1 23 11
432 2006 1 23 10
432 2006 2 22 11
123 2001 1 12 34
123 2007 1 11 12
123 2007 2 11 11
123 2004 1 43 43
所以我想把第二个data.frame的DC1和DC2添加到我的第一个data.frame中。 但是,我希望它根据第一个 data.frame 的年份来做。 另外,我想按月有一列 DC1 和 DC2。 所以,最后我的 data.frame 看起来像这样:
数据帧 3:
ID Year_D DC1_M1 DC1_M2 DC2_M1 DC2_M2
154 2005 32 12 11 10
432 2005 23 na 11 na
123 2007 11 11 12 11
我真的不知道该怎么做? 特别是因为第二个data.frame的结构发生了变化?
先感谢您!
我们可以 pivot 根据第一个数据的“YEAR_F” filter
后将第二个数据集转换为“宽”格式,然后进行连接
library(dplyr)
library(tidyr)
df2 %>%
filter(Year_D %in% df1$YEAR_F) %>%
select(-Year_D) %>%
pivot_wider(names_from = Month, values_from = c(DC1, DC2)) %>%
right_join(df1) %>%
select(names(df1), everything())
-输出
# A tibble: 3 x 6
# ID YEAR_F DC1_1 DC1_2 DC2_1 DC2_2
# <int> <int> <int> <int> <int> <int>
#1 154 2005 32 12 11 10
#2 432 2005 23 NA 11 NA
#3 123 2007 11 11 12 11
或者使用带有merge
和reshape
的base R
merge(df1, reshape(subset(df2, Year_D %in% df1$YEAR_F, select = -Year_D),
idvar = 'ID', direction = 'wide', timevar = 'Month'))
# ID YEAR_F DC1.1 DC2.1 DC1.2 DC2.2
#1 123 2007 11 12 11 11
#2 154 2005 32 11 12 10
#3 432 2005 23 11 NA NA
df1 <- structure(list(ID = c(154L, 432L, 123L), YEAR_F = c(2005L, 2005L,
2007L)), class = "data.frame", row.names = c(NA, -3L))
df2 <- structure(list(ID = c(154L, 154L, 154L, 154L, 432L, 432L, 432L,
123L, 123L, 123L, 123L), Year_D = c(2001L, 2001L, 2005L, 2005L,
2005L, 2006L, 2006L, 2001L, 2007L, 2007L, 2004L), Month = c(1L,
2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L), DC1 = c(4L, 56L, 32L,
12L, 23L, 23L, 22L, 12L, 11L, 11L, 43L), DC2 = c(23L, 22L, 11L,
10L, 11L, 10L, 11L, 34L, 12L, 11L, 43L)), class = "data.frame",
row.names = c(NA,
-11L))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.