代码之家  ›  专栏  ›  技术社区  ›  Alex Howard

如何用秒开始的值填充数据帧?

  •  0
  • Alex Howard  · 技术社区  · 1 年前

    我有一个包含二进制1和0的数据帧,我想用第二个数据帧中的一组数据填充

    真实的数据帧有1000行,所以最好有一种快速的方法。

    一些示例数据:

    data <- data.frame(array(sample(c(0,1),25,replace=TRUE),dim=c(6,4)))
    colnames(data) <- c("sp1","sp2","sp3","sp4")
    size <- data.frame(array(c("sp1","sp2","sp3","sp4",13,16,14,12),dim=c(4,2)))
    
    > data
      sp1 sp2 sp3 sp4
    1   1   1   1   0
    2   0   0   1   0
    3   1   1   0   0
    4   0   1   0   1
    5   0   0   1   0
    6   0   0   0   0
    > size
       X1 X2
    1 sp1 13
    2 sp2 16
    3 sp3 14
    4 sp4 12
    

    我想要一个像这样的数据帧

        sp1 sp2 sp3 sp4
    1   13  16  14  0
    2   0   0   14  0
    3   13  16  0   0
    4   0   16  0   12
    5   0   0   14  0
    6   0   0   0   0
    
    2 回复  |  直到 1 年前
        1
  •  0
  •   Andre Wildberg    1 年前
    数据

    (改变 尺寸$X2 numeric )

    set.seed(1)
    
    data <- data.frame(array(sample(c(0,1),25,replace=TRUE),dim=c(6,4)))
    
    colnames(data) <- c("sp1","sp2","sp3","sp4")
    
    size <- data.frame(X1=c("sp1","sp2","sp3","sp4"), X2=c(13,16,14,12))
    

    sapply

    data.frame(sapply(names(data), \(x)
      ifelse(data[x] == 1, size$X2[which(size$X1 == x)], 0)))
      sp1 sp2 sp3 sp4
    1   0   0   0  12
    2  13   0   0   0
    3   0  16   0   0
    4   0  16  14   0
    5  13   0  14   0
    6   0   0  14   0
    
        2
  •  0
  •   deschen    1 年前

    你可以这样做:

    library(tidyverse)
    
    data %>%
      mutate(across(everything(), 
                    ~if_else(.x == 1,
                             as.numeric(size[size$X1 == cur_column(), 'X2']),
                             .x)))
    

    由于您使用的是采样数据,我正在设置种子:

    set.seed(1)
    

    其给出以下输入和输出:

      sp1 sp2 sp3 sp4
    1   0   0   0   1
    2   1   0   0   0
    3   0   1   0   0
    4   0   1   1   0
    5   1   0   1   0
    6   0   0   1   0
    
    
      sp1 sp2 sp3 sp4
    1   0   0   0  12
    2  13   0   0   0
    3   0  16   0   0
    4   0  16  14   0
    5  13   0  14   0
    6   0   0  14   0