【问题标题】:Assigning values from one data frame to another based on certain rules根据某些规则将值从一个数据帧分配给另一个数据帧
【发布时间】:2021-04-28 13:11:38
【问题描述】:

我有一个数据框,其中每一行都是 1 或 0,列代表主题。现在我需要根据以下规则将另一个数据帧中的值分配给这个数据帧。

  1. 按主题分配值。
  2. 将第二个数据帧的第一行值分配给第一个数据帧。
  3. 重复相同的值,直到第一个数据帧的值为 1。
  4. 当第一个数据帧的值为 1 时,从第二个数据帧分配下一个值。

抱歉,我知道这可能不清楚。请让我举个例子。

  1. 这是第一个数据框的样子

  1. 这是第二个数据框的样子

  1. 预期结果

所以分配给数据框1的编号只有在遇到1时才会改变,如果是0则与前一个编号相同。

数据样本

数据框 1

structure(list(subject = c("subject1", "subject2"), `1` = c(0L, 
0L), `2` = 0:1, `3` = c(0L, 0L), `4` = c(0L, 0L), `5` = c(0L, 
0L), `6` = c(0L, 0L), `7` = c(0L, 0L), `8` = c(0L, 0L), `9` = c(0L, 
0L), `10` = c(0L, 0L), `11` = 1:0, `12` = c(0L, 0L), `13` = 0:1, 
    `14` = c(0L, 0L)), row.names = c(NA, -2L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x0000023598771ef0>)

数据框 2

structure(c(0.338941353970391, 0.276963745357618, 0.271926533090457, 
0.407888635431584, 0.223490014452546, 0.313882923412051), .Dim = 2:3)

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    这是一种方法:

    df1 <- data.frame(df1)
    df1[-1] <- do.call(rbind, lapply(seq(nrow(df1)), function(x) 
                      df2[x, cumsum(unlist(df1[x, -1]) == 1) + 1]))
    df1
    
    #   subject        X1        X2        X3        X4        X5        X6        X7
    #1 subject1 0.3389414 0.3389414 0.3389414 0.3389414 0.3389414 0.3389414 0.3389414
    #2 subject2 0.2769637 0.4078886 0.4078886 0.4078886 0.4078886 0.4078886 0.4078886
    
    #         X8        X9       X10       X11       X12       X13       X14
    #1 0.3389414 0.3389414 0.3389414 0.2719265 0.2719265 0.2719265 0.2719265
    #2 0.4078886 0.4078886 0.4078886 0.4078886 0.4078886 0.3138829 0.3138829
    

    我已将第一个数据转换为数据框。逻辑是,对于df1 中的每一行,当我们遇到 1 时,我们会增加计数,并将其用作索引以从 df2 中的相应行获取值。

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      相关资源
      最近更新 更多