【问题标题】:condtional computation based on two dataframes in R基于R中两个数据帧的条件编译
【发布时间】:2018-01-28 22:13:33
【问题描述】:

我正在执行涉及两个数据帧的计算。我创建了两个数据帧的两个可重现示例作为示例

> df1 Day1 Day2 Day3 Day4 Day5 Day6 Day7 Day8 Day9 Day10 Time1 0.03 0.43 0.39 0.41 0.94 0.70 0.18 0.65 0.72 0.72 Time2 0.42 0.63 0.93 0.53 0.19 0.55 0.22 0.16 0.56 0.04

和

> df2 Day Time X3 X4 X5 1 1 1 9.252042 19.512621 11.601671 2 1 2 5.021522 17.712484 5.044728 3 2 1 9.603795 19.404302 17.206771 4 2 2 19.686793 18.791541 12.655874 5 3 1 7.546551 18.810526 19.865979 6 3 2 18.233872 19.596584 11.653980 7 4 1 17.499680 14.014276 15.553013 8 4 2 8.115352 17.898786 12.841630 9 5 1 10.719540 8.518823 19.126440 10 5 2 12.853401 6.026599 14.041490 11 6 1 19.984946 10.693528 6.890835 12 6 2 16.360035 15.778092 18.087471 13 7 1 15.498714 15.039444 5.259257 14 7 2 13.179111 17.533358 7.382507 15 8 1 5.124188 15.507194 12.547365 16 8 2 8.008336 10.463382 6.934014 17 9 1 11.246527 6.975527 14.464758 18 9 2 17.914083 18.039384 19.324091 19 10 1 9.876625 19.216317 8.787550 20 10 2 11.851955 15.729080 5.741095

df1 中的列表示记录值的天数,行表示小时/或时间(时间 1 或 2)。在df2中,前两列分别代表日期和时间,其他列是记录数据的位置。

我想用 R 做的是创建另一个与 df2 大小相同的数据框,它将 df2[,3:5] 中的值除以相应的 df1 值,即取决于当天的值df2的时间列,选择df1的对应值。 例如,对于 df2$X3 的第一个值,在新数据框中,我将得到 9.252042 除以 0.03 的值。对于 df2$X3 的第三个值,我将得到 9.603795 除以 0.43。

提前感谢您的帮助!

【问题讨论】:

  • 我不清楚你在问什么。除以 df2$X3 的第一个值时,0.03 来自哪里?也许您可以显示一个示例输出表?

标签: r dataframe


【解决方案1】:

我想你的数据(df1 和df2)如下:

df1 = data.frame(time=c(1:10),time1=c(0.03,0.43,0.39,0.41,.94,.70,.18,.065,0.72,0.72),time2 = c(.42,.63,.93,.53,.19,.55,.22,.16,.56,.04))
df2 = data.frame(Day = rep(c(1:10),each=2),Time = rep(c(1,2),10),X3=c(9.2,5.02,9.6,19.6,7.5,18.2,17.4,8.1,10.7,12.8,19.9,16.3,15.4,13.1,5.1,8,11.2,17.9,9.8,11.8),X4=c(19.5,17.7,19.4,18.8,18,19.5,14.01,17.8,8.5,6,10.6,15.7,15,17.5,15,10,6,18,19,15),X5=c(11.6,5,17,12,19,11,15,12,19,14,6,18,5,7,12,6,14,19,8,5))

那么您将新创建df3 的代码将是这样的:

df3 = data.frame(df2$Day,df2$Time,newx3 = df2$X3 / df1$time[df2$Day],newx4 = df2$X4 / df1$time[df2$Day],newx5 = df2$X5 / df1$time[df2$Day])

【讨论】:

    【解决方案2】:

    我的建议是遵循整洁的数据原则

    在这里,我提供了一个与您的数据框结构相同但更加简化且仅在第 1-3 天的示例:

    library(dplyr)
    library(tidyr)
    
    untidy = tibble(day1 = c(0.03,0.42), day2 = c(0.43,0.63), day3 = c(0.39,0.93))
    
    tidy = tibble(day = c(1,1,2,2,3,3), time = c(1,2,1,2,1,2), val1 = c(9.252042,5.012522,9.603795,19.686793,7.546551,18.233872))
    
    untidy_to_tidy = untidy %>% 
      gather(day,val2) %>% 
      mutate(day = as.double(gsub("day","",day)),
        time = rep(c(1,2), (ncol(untidy) * nrow(untidy))/2)) %>% 
      select(day,time,val2)
    
    tidy %>% 
      left_join(untidy_to_tidy, by = c("day","time")) %>% 
      mutate(division = val1 / val2)
    

    如果您是 R 新手,请保持简单并这样做:

    1. 使用来自readr 包的read_csv("YOUR_FILE.CSV") 读取CSV/TSV/etc

    2. 在我的例子中替换

      不整洁 = tibble(day1 = c(0.03,0.42), day2 = c(0.43,0.63), day3 = c(0.39,0.93))

    通过

    untidy = read_csv("YOUR_FILE.CSV")
    

    和

    tidy = tibble(day = c(1,1,2,2,3,3), time = c(1,2,1,2,1,2), val1 = c(9.252042,5.012522,9.603795,19.686793,7.546551,18.233872))
    

    通过

    tidy = read_csv("YOUR_OTHER_FILE.CSV")
    

    【讨论】:

      【解决方案3】:

      您需要做的是小心:您的两个数据框以良好的顺序排列。代码如下:

       df2[3:5]/unlist(df1)
      
                  X3         X4        X5
       1  308.401400 650.420700 386.72237
       2   11.956005  42.172581  12.01126
       3   22.334407  45.126284  40.01575
       4   31.248878  29.827843  20.08869
       5   19.350131  48.232118  50.93841 
       6   19.606314  21.071596  12.53116
       :        :         :          :
       :        :         :          :
      

      【讨论】:

        猜你喜欢
        • 2019-10-22
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 2021-10-25
        • 2021-09-04
        • 2020-01-25
        • 2019-10-13
        • 2022-01-14
        相关资源
        最近更新 更多