繁体   English   中英

如何在 R 中从一个 data.frame 中获取数据并将其放入具有多个条件的另一个中

[英]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

或者使用带有mergereshapebase 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM