【问题标题】:R: match row name in data frame x with column name in data frame y for a given variable value in column shared by the two data framesR:将数据框 x 中的行名称与数据框 y 中的列名称匹配,以匹配两个数据框共享的列中的给定变量值
【发布时间】:2017-10-18 13:39:39
【问题描述】:

假设我有两个如下所示的数据框

> df1
        date firm1 firm2 firm3
1 01-01-2017     1     2    3
2 01-02-2017     4     5    6
3 01-03-2017     7     8    9

> df2
            date
firm1 01-02-2017
firm2 01-01-2017
firm3 01-03-2017

是否可以使用 df1 中的值提取新数据框,其中 df1 的列名和日期值与 df2 的行名和日期匹配?

希望得到的数据框如下所示:

      Value
firm1     2
firm2     4
firm3     9

任何建议将不胜感激!

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:

    我们可以使用row/column索引从'df1'中提取值并创建一个data.frame

    df3 <- data.frame(Value = df1[-1][cbind(1:nrow(df1), match(df2$date, df1$date))])
    row.names(df3) <- row.names(df2)
    df3
    #      Value
    #firm1     2
    #firm2     4
    #firm3     9
    

    【讨论】:

    • 感谢 akrun 解决了问题!我稍微更改了代码的顺序以获得正确的索引:df3 &lt;- data.frame(Value = df1[-1][cbind(match(df2$date, df1$date),1:nrow(df1))])
    【解决方案2】:
    library(reshape2)
    #regenerating the initial datasets
    date <- c("01-01-2017","01-02-2017","01-03-2017")
    firm1 <- c(1,4,7)
    firm2 <- c(2,5,8)
    firm3 <- c(3,6,9)
    df1 <- data.frame(date,firm1,firm2,firm3)
    
    df1
            date  firm1  firm2  firm3
    1: 01-01-2017     1     2     3
    2: 01-02-2017     4     5     6
    3: 01-03-2017     7     8     9
    
    variable <- c("firm1","firm2","firm3")
    date <- c("01-02-2017","01-01-2017","01-03-2017")
    df2 <- data.frame(date,variable)
    
    df2
          date      variable
    1: 01-01-2017    firm1
    2: 01-02-2017    firm2
    3: 01-03-2017    firm3
    
    #changing the format from wide to long
    
    df1b <- melt(df1,id.vars = "date")
    df1b
           date variable value
    1: 01-01-2017    firm1     1
    2: 01-02-2017    firm1     4
    3: 01-03-2017    firm1     7
    4: 01-01-2017    firm2     2
    5: 01-02-2017    firm2     5
    6: 01-03-2017    firm2     8
    7: 01-01-2017    firm3     3
    8: 01-02-2017    firm3     6
    9: 01-03-2017    firm3     9
    
    res <- merge(df2,df1b,by=c("date","variable"))
    
    res  
        date variable value
    1: 01-01-2017    firm2     2
    2: 01-02-2017    firm1     4
    3: 01-03-2017    firm3     9
    

    【讨论】:

    • 是的,更改现已实施!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2017-06-02
    • 2020-09-13
    • 2021-05-06
    • 2021-11-10
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多