【问题标题】:How to bring information from one dataframe to another without losing information for duplicates?如何在不丢失重复信息的情况下将信息从一个数据帧带到另一个数据帧?
【发布时间】:2021-02-25 14:07:50
【问题描述】:

考虑 df1:

id=c(1,2,3,4,5,6); n_df2=c(1,1,2,2,3,3);
df1=as.data.frame(cbind(id,n_df2)); df1

其中 n_df2 是该 id 在 df2 中出现的次数。

id2=c(1,2,3,4,5,6,3,4,5,5,6,6);
value=c(25,35,46,78,12,34,12,33,87,56,11,8);
df2=as.data.frame(cbind(id2,value)); df2

(id2等价于id)

我希望 df1 看起来像这样:

df1$value.1=c(25,35,46,78,12,34) 
df1$value.2=c(NA,NA,12,33,87,11);
df1$value.3=c(NA,NA,NA,NA,56,8); df1;

任何帮助将不胜感激!

谢谢。

【问题讨论】:

    标签: r dataframe join duplicates


    【解决方案1】:

    在基础 R 中你可以这样做:

    merge(df1, reshape(transform(df2[c('id2','value')],
                       time = ave(id2, id2, FUN = seq_along)),dir = 'wide', idvar = 'id2'),
         by.x = 'id', by.y = 'id2', all.x = TRUE)
    
      id n_df2 value.1 value.2 value.3
    1  1     1      25      NA      NA
    2  2     1      35      NA      NA
    3  3     2      46      12      NA
    4  4     2      78      33      NA
    5  5     3      12      87      56
    6  6     3      34      11       8
    

    在tidyverse中

    library(tidyverse)
    df1 %>%
        left_join(df2 %>% 
            select(id2, value) %>%
            group_by(id2) %>%
            mutate(time = row_number()) %>% 
            pivot_wider(id2, names_from=time, names_prefix='value.', values_from = 'value'), 
           c('id'='id2'))
    
         id n_df2 value.1 value.2 value.3
    1  1     1      25      NA      NA
    2  2     1      35      NA      NA
    3  3     2      46      12      NA
    4  4     2      78      33      NA
    5  5     3      12      87      56
    6  6     3      34      11       8
    

    【讨论】:

    • 谢谢!只是我忘了提到,在我的真实数据中,df2还有另一个变量,我怎样才能只带值变量?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2022-06-24
    • 2016-08-16
    相关资源
    最近更新 更多