【问题标题】:Transforming key values from one data frame into columns of another data frame将一个数据帧中的键值转换为另一个数据帧的列
【发布时间】:2018-07-05 14:42:54
【问题描述】:

我已经四处搜索,但找不到我的问题的特定答案。

假设我有两个数据框:

df1 <- data.frame(name = c('a', 'b', 'c'),
                  t1 = c(3, 25, 400),
                  t2 = c(3, 25, 400),
                  t3 = c(NA, 25, 800),
                  t4 = c(NA, 25, 800),
                  t5 = c(NA, 25, 800),
                  t6 = c(NA, 25, 800),
                  t7 = c(5, 90, 1200))

df2 <- data.frame(id = c(1, 2),
                  t1 = c(0.33, 0.98),
                  t2 = c(0.87, 0.54),
                  t3 = c(0.92, 0.84),
                  t4 = c(0.65, 0.16),
                  t5 = c(0.94, 0.84),
                  t6 = c(0.16, 0.02),
                  t7 = c(0.93, 0.18))

在上面的示例中,df2 有两行数据用于测试测量。 (t1 .. t7)

df1 具有执行测试测量 (t1 .. t7) 的测试条件 (a, b, c) 的值。

我正在寻找一种方法来创建一个新的数据框,它将测试条件(a、b、c)转换为列,并将它们与测试测量值结合起来,以便生成的数据框如下所示:

# Desired Output
#
#  id   a   b   c    t1    t2    t3    t4    t5    t6    t7
#  1    3   25  400  0.33  0.87  NA    NA    NA    NA    NA
#  1    NA  25  800  NA    NA    0.92  0.65  0.94  0.16  NA
#  1    5   90  1200 NA    NA    NA    NA    NA    NA    0.93
#  2    3   25  400  0.98  0.54  NA    NA    NA    NA    NA
#  2    NA  25  800  NA    NA    0.84  0.16  0.84  0.02  NA
#  2    5   90  1200 NA    NA    NA    NA    NA    NA    0.18

感谢您的帮助!

【问题讨论】:

    标签: r plyr reshape reshape2


    【解决方案1】:

    这是一种方法,使用gatherinner_join,然后两次调用spread

    library(tidyverse)
    
    df1 %>%
        gather(variable, value, -name) %>% #wide to long
        inner_join(df2 %>% gather(variable, value, -id), by = 'variable') %>%
        spread(name, value.x) %>% # spread first time
        spread(variable, value.y) # spread second time
    
      id  a  b    c   t1   t2   t3   t4   t5   t6   t7
    1  1  3 25  400 0.33 0.87   NA   NA   NA   NA   NA
    2  1  5 90 1200   NA   NA   NA   NA   NA   NA 0.93
    3  1 NA 25  800   NA   NA 0.92 0.65 0.94 0.16   NA
    4  2  3 25  400 0.98 0.54   NA   NA   NA   NA   NA
    5  2  5 90 1200   NA   NA   NA   NA   NA   NA 0.18
    6  2 NA 25  800   NA   NA 0.84 0.16 0.84 0.02   NA
    

    逐行逐行查看结果可能会有所帮助。这将是一个非常冗长且繁琐的答案,但您应该考虑在自己的 R 会话中进行。

    【讨论】:

      猜你喜欢
      • 2020-08-06
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      相关资源
      最近更新 更多